跳转到主要内容

Makina Corpus赞助的zc.buildout食谱,用于编译和安装软件或Python包,并生成脚本或配置文件。

项目描述

简介

这是一组可以在minitage环境中使用或不在minitage环境中使用的食谱。在minitage中使用它们的好处是,你将自动拥有构建环境中所有的系统依赖项。

该egg有以下入口点
  • cmmi:安装配置/制作/制作安装软件

  • fetch:使用git、http、frp、静态、hg、svn或bzr从某处获取某些东西。

  • egg:安装Python eggs / packages 'setuptools'

  • printer:打印或输出所有版本,这些版本是满足egg需求所必需的(versions.cfg变得简单)

  • scripts:从egg中安装脚本,并在它们不在缓存中的情况下安装egg依赖项

  • wsgi:制作一个Python paste配置文件,该文件可以通过mod_wsgi食用,并包含所有必需的egg依赖项。

我为什么要重新编写另一个buildout食谱构建器的理由是
  • 支持下载内容

  • 不依赖于easy_install依赖系统

  • 支持egg和其他发行版的即时补丁。

  • 支持在构建系统每个阶段支持多个钩子。

  • 支持 distutils

  • 强大的离线模式

  • 我们喜欢 pypi,但提供了一种扫描 eggs 的模式,无需检查索引,

  • 支持格式错误或未索引的分布。换句话说,我们提供一个 URL,然后配方构建它,就这么多。

  • 所有配方都必须支持自动整理依赖关系和 rpath 链接。

您可以在 minitage 的以下资源中浏览代码

您可以使用 buildout.minitagificator 无需任何努力迁移您的构建输出

Makina Corpus赞助的软件

makinacom

minitage.recipe.scripts

摘要

  • 此配方旨在安装 eggs 和 Python 软件,并在已安装的软件之上生成脚本和环境文件。

  • 此配方继承自 minitage;recipe:egg。

  • 它受到 zc.recipe.eggs* 的极大启发,并试图完全替代它,同时保持 API 兼容性。

  • 您可以使用它与 buildout.minitagificator 扩展结合使用,该扩展 monkey patch zc.buildout 以使用 minitage 配方。

  • 我们可以做到 zc.recipe.egg 做不到的事情,或者根本做不到,或者不是我们想要的方式

    • 所有脚本都支持初始化代码

    • 还处理了 'scripts' eggs 元数据

  • 您可以使用它就像使用 minitage.recipe:egg 一样,使用修补工具和等。

  • 此配方还声明在以下入口点下

    • minitage.recipe:eggs

    • minitage.recipe:script

特定选项

  • 所有共享选项和来自 minitage.recipe:egg 的选项 +

  • 脚本

    • 要生成的脚本,如果为空,则为所有工作集生成脚本。

    • 如果您的 egg 有旧的 'scripts' 元数据,并且您想要生成包装器的旧脚本,只需将 egg 名称添加到脚本条目中。

    • 如果您想重命名一个脚本,只需输入类似 entrypoint|scriptname=NewName 的内容

      s=NewName
  • 如果不想创建脚本,只需输入一行分隔的不想要的脚本列表

  • 入口点

    一个入口点标识符的列表,形式如下:

    name=module:attrs

    其中 name 是脚本名称,module 是解析到模块名称的点分隔名称,而 attrs 是解析到模块中的可调用对象的点分隔名称。此选项在处理未声明入口点的分布时很有用,例如,未编写为与 setuptools 一起工作的分布。

  • 解释器

    要生成的脚本的名称,该脚本允许使用设置了所有工作集条目的 PYTHONPATH 访问 Python 解释器。

  • dependent-scripts 当设置为 true 时,除了特定命名的 eggs 外,还会为所有必需的 eggs 生成脚本。这个想法来自此配方的两个分支,repoze.recipe.egg 和 pylons_sandbox,但选项名称用短划线而不是下划线拼写,默认值为 false。

  • (script-name|interpretername-)arguments

    指定一些作为 Python 源传递给入口点的参数。

  • (script-name|interpretername-)initialization

    在调用入口点之前运行的 Python 代码

  • env_initialization

    在 env(shell)初始化之后运行代码

  • template-replacements

    • 在模板中替换变量值以覆盖 buildout 的 strip 机制(初始化、env_initialization、arguments)

    • => 前后的空格很重要

    • 模式的形式是

      re-pattern => value

详细文档

生成所有脚本

因此,如果不指定任何脚本入口点在 buildout 部分。

>>> init_env()
>>> index_url = start_server(os.path.sep.join(tempdir))
>>> data = """
... [buildout]
... eggs-directory =${buildout:directory}/eggs
... download-cache=${buildout:directory}/dl
... parts = part
... [part]
... recipe=minitage.recipe.scripts
... find-links=%(index)s
... eggs=foo
... """%{'index': index_url}
>>> touch('buildout.cfg', data=data)
>>> noecho = [remove(os.path.join('eggs', egg)) for egg in os.listdir('eggs') if 'foo' in egg]
>>> sh('bin/buildout -vvvvv install')
b...
minitage.recipe: Generated scripts: 's', 'toto.py'...

看看生成了什么。

>>> cat('bin', 'toto.py')
#!...
# ! GENERATED BY minitage.recipe !
import os
import sys
import subprocess...
sys.path[0:0] = ['/tmp/buildout.test/eggs/foo-1.0-py....egg' ]...
# EXEC ORGINAL CODE WITHOUT SHEBANG
__doc__  = 'I am generated by minitage.recipe.script recipe'...
os.environ['PYTHONPATH'] = ':'.join(sys.path + os.environ.get('PYTHONPATH', '').split(':'))
sys.argv.pop(0)
sys.exit(
    subprocess.Popen(
        [sys.executable, '/tmp/buildout.test/eggs/foo-1.0-py....egg/EGG-INFO/scripts/toto.py']+sys.argv,
        env=os.environ
    ).wait()
)...
>>> cat('bin', 's')
#!...
#!!! #GENERATED VIA MINITAGE.recipe !!!...
import sys...
sys.path[0:0] = [ '/tmp/buildout.test/eggs/foo-1.0-py....egg' ]...
import toto.toto...
if __name__ == '__main__':
    toto.toto.f()...

选择要安装的脚本

仅安装 s。

>>> init_env()
>>> index_url = start_server(os.path.sep.join(tempdir))
>>> data = """
... [buildout]
... eggs-directory =${buildout:directory}/eggs
... download-cache=${buildout:directory}/dl
... parts = part
... [part]
... recipe=minitage.recipe.scripts
... find-links=%(index)s
... scripts =
...     s
... eggs=foo
... """%{'index': index_url}
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -vvvvv install')
b...
minitage.recipe: Generated scripts: 's'...

仅安装 toto.py。

>>> data = """
... [buildout]
... eggs-directory =${buildout:directory}/eggs
... download-cache=${buildout:directory}/dl
... parts = part
... [part]
... recipe=minitage.recipe.scripts
... find-links=%(index)s
... scripts =
...     toto.py
... eggs=foo
... """%{'index': index_url}
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -vvvvv install')
b...
minitage.recipe: Generated scripts: 'toto.py'....

声明入口点

我们将添加一个要生成的 't' 入口点。

>>> init_env()
>>> index_url = start_server(os.path.sep.join(tempdir))
>>> data = """
... [buildout]
... eggs-directory =${buildout:directory}/eggs
... download-cache=${buildout:directory}/dl
... parts = part
... [part]
... recipe=minitage.recipe.scripts
... find-links=%(index)s
... entry-points=t=toto.toto:f
... eggs=foo
... """%{'index': index_url}
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -vvvvv install')
b...
minitage.recipe: Generated scripts: 't'...
>>> cat('bin', 't') #doctest: +REPORT_NDIFF
#!...
#!!! #GENERATED VIA MINITAGE.recipe !!!
<BLANKLINE>
import sys
<BLANKLINE>
<BLANKLINE>
<BLANKLINE>
sys.path[0:0] = [ '/tmp/buildout.test/eggs/foo-1.0-...
...]
<BLANKLINE>
<BLANKLINE>
<BLANKLINE>
import toto.toto
<BLANKLINE>
if __name__ == '__main__':
    toto.toto.f()
<BLANKLINE>

添加初始化代码

关于为 gis env 添加环境变量的情况。

>>> init_env()
>>> index_url = start_server(os.path.sep.join(tempdir))
>>> data = """
... [buildout]
... eggs-directory =${buildout:directory}/eggs
... download-cache=${buildout:directory}/dl
... parts = part
... [part]
... recipe=minitage.recipe.scripts
... find-links=%(index)s
... entry-points=t=toto.toto:f
... eggs=foo
... initialization = import os;os.environ.set('GDAL', 'TRUE')
... """%{'index': index_url}
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -vvvvv install')
b...
>>> "import os;os.environ.set('GDAL', 'TRUE')" in open(os.path.join('bin', 't')).read()
True

添加参数

关于为我们的启动器添加参数的情况。

>>> init_env()
>>> index_url = start_server(os.path.sep.join(tempdir))
>>> data = """
... [buildout]
... eggs-directory =${buildout:directory}/eggs
... download-cache=${buildout:directory}/dl
... parts = part
... [part]
... recipe=minitage.recipe.scripts
... find-links=%(index)s
... eggs = foo
... entry-points=t=toto.toto:f
... arguments = ['a', 'b']
... """%{'index': index_url}
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -vvvvv install')
b...
>>> "toto.toto.f(['a', 'b'])" in open(os.path.join('bin', 't')).read()
True

生成Python解释器

以下是生成具有工作集所有环境的特定Python解释器的方法。

>>> init_env()
>>> index_url = start_server(os.path.sep.join(tempdir))
>>> data = """
... [buildout]
... eggs-directory =${buildout:directory}/eggs
... download-cache=${buildout:directory}/dl
... parts = part
... [part]
... recipe=minitage.recipe.scripts
... find-links=%(index)s
... interpreter = mypy
... arguments = ['a', 'b']
... eggs=foo
... """%{'index': index_url}
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -vvvvv install')
b...
minitage.recipe: Generated scripts: 'mypy',...
>>> cat('bin', 'mypy')
#!...
#!!! #GENERATED VIA MINITAGE.recipe !!!...
sys.path[0:0] = [ '/tmp/buildout.test/eggs/foo-1.0-py....egg' ]...
if _interactive:
    import code
    code.interact(banner="", local=globals())...

生成环境文件

以下是生成特定环境文件的方法,您可以从该文件中获取PYTHONPATH,并填充您已配置的eggs。

>>> init_env()
>>> index_url = start_server(os.path.sep.join(tempdir))
>>> data = """
... [buildout]
... download-cache=${buildout:directory}/dl
... eggs-directory =${buildout:directory}/eggs
... parts = part
... [part]
... recipe=minitage.recipe.scripts
... find-links=%(index)s
... env-file = mypy
... eggs=foo
... """%{'index': index_url}
>>> touch('buildout.cfg', data=data)
>>> sh('bin/buildout -vvvvv install')
b...
>>> cat('bin', 'mypy')
#!/usr/bin/env sh
<BLANKLINE>
PYTHONPATH="/tmp/buildout.test/eggs/foo-1.0..."
export PYTHONPATH
<BLANKLINE>
<BLANKLINE>
<BLANKLINE>
<BLANKLINE>

变更日志

1.58 (2013-03-31)

  • 修复了一个错误,该错误会在某些边缘情况下生成带有额外信息的eggs脚本。

1.57 (2013-02-13)

  • buildout2 兼容性

1.56 (2013-02-13)

  • 保留脚本的返回代码

1.55 (2011-03-11)

  • 使用 os.execvpe 来生成进程,而不是 subprocess。感谢 Dave Foster (daf)

  • 分割测试

  • 为解释器脚本添加初始化

  • 修复类型“列表”和模式替换代码

1.50

  • 解决当 setup.py 中锁定版本与 buildout 中的不同版本存在冲突时的安装问题

1.47

  • 添加了依赖脚本选项,以坚持使用 zc.recipe.egg

1.45

  • 更好地处理入口点/控制台脚本冲突选项(cs. 前缀,见代码)

  • 添加每个脚本的选项(初始化、参数、Python)

1.44

  • 当 EntryPoint 和 Script 有相同的名称时,以 EP 为胜。

1.41

  • 修复了一个特殊情况,其中所有脚本都被过滤掉了

1.39

  • 在生成 env.file 时不要保留 PYTHONPATH

1.37

  • 装饰器辅助工具

1.36

  • 修复开发链接

1.35

  • 从 minitage.recipe 中分割出来

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解有关安装包的更多信息。

源代码分发

minitage.recipe.scripts-1.58.zip (31.9 kB 查看哈希值)

上传时间 源代码

由以下支持

AWS AWS 云计算和安全赞助商 Datadog Datadog 监控 Fastly Fastly CDN Google Google 下载分析 Microsoft Microsoft PSF 赞助商 Pingdom Pingdom 监控 Sentry Sentry 错误日志 StatusPage StatusPage 状态页