我有几个共享常见模块的python项目.到现在为止,我已经......咳嗽......保留公共代码的多个副本并手动同步.但我显然更愿意做别的事情.
它现在在我看来,好像zc.Buildout可能是我需要的.我想我应该做的是将我系统的每个可重用组件放入一个单独的egg中,然后使用buildout将它们组装到项目中.
我也在想,对于任何特定的模块,我应该将单元测试放入一个单独的包或蛋中,这样我就不会在每个项目中安装组件的单元测试副本.我只想在我的库开发的地方进行单元测试,而不是在刚刚使用的地方.
所以也许我想要这样的东西
projects
lib1
tests
code
lib2
tests
code
app1
tests
appcode
app2
tests
appcode
Run Code Online (Sandbox Code Playgroud)
等等
app1和app2都是独立的应用程序,有自己的代码和测试,但也包括和使用lib1和lib2.和lib1/test,lib1/code,lib2/test,lib2code,app1,app2是分开的鸡蛋.这听起来不错吗?
但是,我现在感到困惑.我假设当我开发app1时,我希望buildout将lib1,lib2和app1的副本放到一个单独的工作目录中,而不是直接将这些库的副本放在app1下.但是,这如何与我的SVN源代码控制一起使用?如果使用buildout动态构造工作目录,它不能是一个实时SVN目录,我可以从中检查更改回存储库?
我是否误解了如何使用buildout?我会更好地采用完全不同的方法吗?如何在项目之间混合源代码控制和模块重用?
更新:感谢两位目前已回答此问题的人.我正在尝试更多这个.
是否有一种简单的方法可以在buildout配置中转义用于变量替换的魔术字符,这样就可以保留字符串.换句话说,我说的地方:
[part]
attribute = ${variable}
Run Code Online (Sandbox Code Playgroud)
我实际上并不希望它扩展$ {variable},而是将其保留为文字值.
实际上,我遇到的具体问题不是在buildout配置文件本身,而是在由配方'collective.recipe.template'处理的模板文件中.这使用配置文件中使用的buildout中的相同变量替换引擎.问题是我想用作模板的文件已经将'$ {variable}'语法与最终使用该文件的应用程序配置系统结合使用.
我找到解决问题的唯一方法是使用类似的东西:
[server-xml]
recipe = collective.recipe.template
input = templates/server.xml.in
output = ${product:build-directory}/conf/server.xml
dollar = $
Run Code Online (Sandbox Code Playgroud)
在模板输入文件中,然后有:
${dollar}{variable}
Run Code Online (Sandbox Code Playgroud)
代替:
${variable}
Run Code Online (Sandbox Code Playgroud)
它已经有了.
这样做是因为使用模板对该部分查找'dollar'属性并将其替换为'$'.
而不是必须这样做,有点希望人们可以这样做:
\${variable}
Run Code Online (Sandbox Code Playgroud)
或者甚至是:
$${variable}
Run Code Online (Sandbox Code Playgroud)
并且消除了必须具有虚拟属性以欺骗它做我想要的事情的需要.
查看buildout的源代码,它匹配变量替换的方式似乎不提供转义机制.
如果确实没有办法,那么也许有人知道可以进行变量扩展的另一个构建模板配方,但是它提供了一种表示变量的任何方式的转义机制,这样可以避免可能存在冲突的问题.模板系统扩展机制和模板文件中的文字数据.
我正在尝试使用buildout和我自己的代码来部署OpenERP.事实上,我想构建一个完整的部署结构,允许我将OpenERP与自定义模块和补丁一起使用.
首先,在添加任何个人配置之前,我试图创建一个具有配置所有内容的责任的buildout.
我的buildout.cfg配置文件如下所示:
[buildout]
parts = eggs
versions=versions
newest = false
extensions = lovely.buildouthttp
unzip = true
find-links =
http://download.gna.org/pychart/
[versions]
[eggs]
recipe = zc.recipe.egg
interpreter = python
eggs =
Paste
PasteScript
PasteDeploy
psycopg2
PyChart
pydot
openerp-server
Run Code Online (Sandbox Code Playgroud)
但是当尝试启动buildout时,我在尝试安装最后需要的蛋时会出现一些错误(openerp-server)
在我这边它只是找不到这些模块,但它们在我的蛋目录中:
Error: python module psycopg2 (PostgreSQL module) is required
Error: python module libxslt (libxslt python bindings) is required
Error: python module pychart (pychart module) is required
Error: python module pydot (pydot module) is required
error: Setup script exited with 1 …Run Code Online (Sandbox Code Playgroud) 我试图让buildout从我的github帐户使用一个特定的,分叉和调整的包,但它似乎完全忽略了引用,而是选择了标准的PyPi模块.
这是我的buildout配置:
[buildout]
parts = foo
find-links = http://github.com/me/themodule/tarball/version#egg=themodule-version
versions = versions
eggs = ...
[versions]
themodule=version
[foo]
eggs =
${buildout:eggs}
themodule
Run Code Online (Sandbox Code Playgroud)
我正在使用最新zc.buildout的pypi 1.5.2版本.
我已尝试过两者http并https为链接(因为最近的github更改).链接是活动的并且直接工作,所以我猜它是我的配置.我错过了什么吗?
我正在潜入包装Python应用程序的世界,并设法进入这种混乱状态,由于我应该处理的所有概念和选项,我的头开始旋转.
题:
我需要完成什么?从位于git服务器上的源部署我的Python项目.部署工具应该获取并安装所有依赖项,其中大部分都可以通过PIP获得,一个需要通过Git获取和安装.最终结果应该可以通过Pip安装,所以我可以做一些事情:
[~] git clone git://some/path/project.git
[~] pip install project/
Run Code Online (Sandbox Code Playgroud)
上下文: 目前我正在尝试让Distutils2做我想做的事,但似乎使用'generate-setup'命令创建的setup.py不能与Pip一起使用.
我想使用Distutils2,因为它应该是所有人的未来证明.但是关于所有工具的各种文档都是可怕的(准确的信息与过时和不准确的信息混合在一起),这会让一个人质疑他的理智.
所以我该怎么做?坚持distutils和setup.py?或者我需要看一下像Buildout这样的东西?
请问那些善意的回答者请说明我应该使用特定工具做什么(例如:使用Distutils2部署代码,使用PIP安装依赖项,git依赖项编写脚本并将所有内容粘合在一起做XYZ).
编辑:我使用的是Distutils2 1.0a4,它似乎与文档不兼容.
编辑2:重新格式化问题,使我的问题更清楚.
Edit3:这是我打破Python打包和分发工具链的第四次尝试.我不是想让其他人为我做我的工作,但是对于一个新手而言,几乎不可能破解特定工具应该做什么,它开始的地方和另一个结束的地方.特别是因为工具之间的功能重叠.我不是位于硅谷周围的圣人,他们可以让我知道秘密,公开的文件是没有用的.
最终编辑: 虽然在开始这个问题时我并没有考虑用Buildout替换virtualenv.但在做研究的过程中,我意识到了我一直都知道的事情,但我并没有完全清楚地告诉我.有关Python打包和部署自动化的方法有很多种.还有许多工具可以帮助您完成工作.然而,虽然这些工具之间存在显着的功能重叠,但工具链却在不断发展,到目前为止还没有明确的"标准最佳实践".分配工具链军备竞赛仍处于全面激烈状态,尚未出现明显的胜利者.这可能会让我们感到困惑,他们希望Python中的大部分内容都能正常工作.我所追求的(distutils/setuptools + pip + virtualenv以Buildout方式甚至与Buildout半集成)当然是可行的,但它没有多大意义,不是因为它不可能 - 而是因为没有人这样做.如果你需要这种复杂程度,那么你需要提交.就个人而言,我决定将virtualenv抛弃(对于这个项目)并拥抱Buildout.
我整天都在苦苦挣扎,真正了解如何使用buildout和pip.观看了一堆视频等,但我仍然很难搞清楚做什么和不做扩展和点子.
欢迎提供任何帮助,教程和书籍.
我正在尝试完全切换到buildout - 但我们的开发环境已经安装了很多东西 /usr/lib/pythonxx/
我怎样才能确保buildout不使用系统上已安装的库 - 最终没有virtualenv?
例如 - 如何避免这种行为?:
> cat buildout.cfg
[buildout]
parts = django
[django]
recipe = zc.recipe.egg
eggs = django
interpreter = django
>bin/django
>>> import django
>>> django
<module 'django' from '/usr/lib/python2.6/site-packages/django/__init__.pyc'>
>>>
Run Code Online (Sandbox Code Playgroud)
无论如何强制buildout不使用/usr/lib/python2.6中安装的鸡蛋?
我正在为OS X开发一个应用程序.该应用程序涉及使用安全连接通过python请求与服务器通信.
我能够运行我打算打包的python文件,并且它通过SSL连接成功.但是,当我用py2app打包文件并尝试运行它时,我收到以下错误:
Traceback (most recent call last):
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/__boot__.py", line 338, in <module>
_run()
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/__boot__.py", line 333, in _run
exec(compile(source, path, 'exec'), globals(), globals())
File "/Users/yossi/Documents/repos/drunken-octo-nemesis/dist/drunken-octo.app/Contents/Resources/media_test.py", line 16, in <module>
cmpbl.syncWithCloud()
File "src/compare_book_lists.pyc", line 172, in syncWithCloud
File "src/compare_book_lists.pyc", line 64, in checkMediaOnCloud
File "src/get_cloud_book_list.pyc", line 26, in getCloudFulfilledBookList
File "requests/api.pyc", line 55, in get
File "requests/api.pyc", line 44, in request
File "requests/sessions.pyc", line 354, in request
File "requests/sessions.pyc", line 460, in send
File "requests/adapters.pyc", line 250, in …Run Code Online (Sandbox Code Playgroud) 例如,以下内容是使用 bin/buildout -Nvv
...
Getting required 'grokcore.component>=2.5'
required by five.grok 1.3.2.
required by grokcore.viewlet 1.11.
Picked: grokcore.component = 2.5
Getting required 'grokcore.annotation'
required by five.grok 1.3.2.
Picked: grokcore.annotation = 1.3
The constraint, 0.4, is not consistent with the requirement, 'five.localsitemanager>2.0dev'.
While:
Installing instance.
Error: Bad constraint 0.4 five.localsitemanager>2.0dev
Run Code Online (Sandbox Code Playgroud)
约束five.localsitemanager>2.0dev似乎并没有被grokcore.annotation强制执行(见https://github.com/zopefoundation/grokcore.annotation/blob/master/setup.py),但我怎么找出鸡蛋实际执行呢?
我有一个Plone站点(大约4.2.4,从version.txt根目录中的一个说明),我想更新到最新版本(我发现了这个方法)(截至目前4.3.4); 我继承了过多的固定版本,这些版本没有记录,可能已经过时了.
当注释掉我versions.cfg,使用http://dist.plone.org/release/4.3-latest/versions.cfg替代和重新运行buildout用-vvv,我得到:
Develop: '.../src/collective.mathjax'
in: '.../src/collective.mathjax'
/tmp/tmpbXsnpD -q develop -mxN -d .../develop-eggs/tmp2yhe9ubuild
...
Installing 'zc.recipe.egg'.
We have the best distribution that satisfies 'zc.recipe.egg<2dev'.
Picked: zc.recipe.egg = 1.3.2
...
There is a version conflict.
We already have: zc.recipe.egg 1.3.2.
While:
Installing.
Getting section test.
Initializing section test.
Installing recipe zc.recipe.testrunner.
Run Code Online (Sandbox Code Playgroud)
因此似乎有一些要求的子2版本zc.recipe.egg,但我找不到它.(在我versions.cfg看来它是固定的2.0.1- 曾经工作,令人惊讶.)
我搜索了树find和grep,寻找rc.recipe.egg在version*.cfg …