0

我正在寻找一种更好的方式来构建我的研究项目。我有以下设置:

有项目abc图书馆lib。每个项目处理一个不同的研究问题,并且该库包含跨项目使用的代码。因此所有项目都依赖于lib. c由于项目依赖于项目a,事情变得更加复杂b。当我在项目上工作时c,我也会更新ab或者lib同时更新。每个项目都在一个单独的 git 存储库中。

到目前为止,我已经通过包含上面的依赖项来处理这种情况,git submodule并且所有源文件都位于项目的根目录中。优点是我可以跟踪lib我的项目所依赖的版本。此外,我的一个项目可能依赖于过时版本的lib. 我从根目录运行所有内容,而不将任何包“安装”到站点包左右。当路径设置不正确时,我通过sys.path.insert.

但是,以下几点让我想更改布局:

  • lib我一直忘记我正在编辑哪个版本。
  • 我想使用自动化测试工具(tox、jenkins 等),使用标准项目设置似乎更容易处理。
  • sys.path.insert可能会导致难以调试的细微问题。
  • 我通常希望我的所有项目都能使用lib

因此,我目前正在重新安排所有项目(特别是lib)以符合标准 Python 目录结构(源存储在子目录中,根目录包含一个setup.py文件),以便能够在virtualenv. 然后我可以在requirements.txt. 首先,我lib通过 pip install -e 安装为开发。然后我运行 pip freeze > requirements.txt ,其中包含与此类似的行。

-e git+<path_to_remote>@<sha>#egg=`lib`

因此,我再次生成了对特定提交(sha)的依赖项git submodule,确保我可以签出旧提交并且项目应该运行。我现在可以在 a 中安装所有东西virtualenv并摆脱我的路径问题。伟大的。

不过,我面临一些新的麻烦。一个问题是,如何更新requirements.txt. 我看到的最简单(但可能不是最优雅)的解决方案是编写一个pre-commit hook在提交之前更新 sha 的解决方案。有没有更好的办法?

更一般地说 - 给定我的设置,您是否看到更好的解决方案?

4

1 回答 1

0

据我所知,你已经大部分解决了你的问题,只剩下一小部分了。

1)不要使用哈希来识别你的库的版本。即使您没有将库发布到 Cheese Shop,也请执行正常的库版本控制 ( semver ) 并相应地标记您的 git 存储库。git+https://github.com/...在依赖项的 URL 中,您将拥有人类可读和可管理的版本。

2) 使您的 tox 设置可以让您测试稳定版本的依赖项(您上次标记的)和最新的 repo 修订版的主版本。

于 2015-04-09T10:55:24.450 回答