我正在寻找一种更好的方法来组织我的研究项目。我有以下设置:
有项目a、b、c和一个库lib。每个项目处理一个不同的研究问题,库包含跨项目使用的代码。因此,所有项目都依赖于lib。事情变得更加复杂,因为项目c也依赖于项目a和b。当我在项目c工作时,我还会同时更新a、b或lib。每个项目都位于一个单独的git存储库中。
到目前为止,我已经通过通过git submodule包含上面的依赖项来处理这种情况,并且所有源文件都位于项目的根dir中。优点是我跟踪我的项目所依赖的lib版本。另外,我的一个项目可能依赖于过时版本的lib。我在没有“安装”任何软件包到站点软件包的情况下运行根目录中的所有内容。当路径设置不正确时,我将通过sys.path.insert重写它。
但是,以下几点使我想要更改布局:
lib。sys.path.insert可能导致难以调试的微妙问题。lib的技巧。因此,我目前正在重新安排所有项目(特别是lib),使其符合标准的virtualenv目录结构(源存储在子目录中,根包含一个setup.py文件),以便能够在virtualenv中工作。然后,我可以在requirements.txt中列出我的所有依赖项。首先,我通过pip作为开发工具安装-e。然后我运行pip > requirements.txt,其中包括一个类似于此的行。
-e git+<path_to_remote>@<sha>#egg=`lib`因此,我再次生成了与git submodule一样的特定提交(sha)的依赖关系,确保我可以签出一个旧的提交,并且项目应该运行。现在,我可以在virtualenv中安装所有东西,并解决路径问题。太棒了。
不过,我遇到了一些新的麻烦。一个问题是,如何在requirements.txt中更新sha。我看到的最简单的(但可能不是最优雅的)解决方案是编写一个pre-commit hook,在执行之前更新sha。有更好的办法吗?
更广泛地说-你认为有更好的解决方案吗?
发布于 2015-04-09 10:55:24
据我所见,你已经基本上解决了你的问题,只剩下一点点了。
1)不要使用散列来识别库的版本。即使您没有将库发布到Cheese,也要做一个正常的库版本控制(符号学),并相应地标记git存储库。以某种方式,您将在依赖项的git+https://github.com/... URL中具有可读的和可管理的版本。
2)让你的毒理设置能够让你测试稳定版本的依赖(你上次标记)和主版本,从最新的回购修订。
https://stackoverflow.com/questions/25693246
复制相似问题