Pip 项目结构。科学巨蟒项目
我正在寻找一种更好的方法来组织我的研究项目。我有以下设置: 有项目Pip 项目结构。科学巨蟒项目,pip,virtualenv,setuptools,project-structure,tox,Pip,Virtualenv,Setuptools,Project Structure,Tox,我正在寻找一种更好的方法来组织我的研究项目。我有以下设置: 有项目a、b、c和库lib。每个项目处理一个不同的研究问题,库中包含跨项目使用的代码。因此,所有项目都依赖于lib。随着项目c也依赖于项目a和b,事情变得更加复杂。当我在项目c上工作时,我还将同时更新a、b或lib。每个项目都位于单独的git存储库中 到目前为止,我已经通过git子模块包含了上面的依赖项来处理这种情况,并且所有源文件都位于项目的根目录中。优点是我可以跟踪我的项目所依赖的lib版本。另外,我的一个项目可能依赖于过时版本的l
a
、b
、c
和库lib
。每个项目处理一个不同的研究问题,库中包含跨项目使用的代码。因此,所有项目都依赖于lib
。随着项目c
也依赖于项目a
和b
,事情变得更加复杂。当我在项目c
上工作时,我还将同时更新a
、b
或lib
。每个项目都位于单独的git存储库中
到目前为止,我已经通过git子模块
包含了上面的依赖项来处理这种情况,并且所有源文件都位于项目的根目录中。优点是我可以跟踪我的项目所依赖的lib
版本。另外,我的一个项目可能依赖于过时版本的lib
。我从根目录运行所有内容,而不“安装”任何包到站点包等等。当路径设置不正确时,我会通过sys.path.insert
覆盖它
但是,以下几点让我想更改布局:
- 我一直不知道我正在编辑哪个版本的
李>lib
- 我想使用自动化测试工具(tox、jenkins等),它似乎更容易处理标准项目设置李>
会导致难以调试的微妙问题李>sys.path.insert
- 我通常希望我的所有项目都使用
技巧李>lib
lib
)以符合标准Python目录结构(源代码存储在子目录中,根目录包含setup.py
文件),以便能够在virtualenv
中工作。然后我可以在requirements.txt
中列出我的所有依赖项。首先,我通过pip install-e安装lib
as develope。然后我运行pip freeze>requirements.txt,其中包含一行类似于此的代码
-e git+<path_to_remote>@<sha>#egg=`lib`
-e git+@#egg=`lib`
因此,我再次生成了一个对特定提交(sha)的依赖项,与git子模块
一样,确保我可以签出一个旧的提交,并且项目应该运行。我现在可以在一个virtualenv
中安装所有东西,并且摆脱了路径问题。太好了
不过我面临一些新的麻烦。一个问题是,如何在requirements.txt
中更新sha。我看到的最简单(但可能不是最优雅)的解决方案是编写一个pre-commit hook
,在提交之前更新sha。有更好的办法吗
更一般地说,根据我的设置,您认为有更好的解决方案吗 据我所知,你已经基本解决了你的问题,只剩下一点点了 1) 不要使用哈希来标识库的版本。即使您没有将库发布到Cheese Shop,也要执行普通的库版本控制()并相应地标记git存储库。这样,您将在
git中拥有人类可读和可管理的版本+https://github.com/...
依赖项的URL
2) 使您的tox设置能够让您测试依赖项的稳定版本(您上次标记的)和最新repo版本的主版本