【问题标题】:Project structure. Scientific Python projects项目结构。科学 Python 项目
【发布时间】:2014-09-05 20:06:51
【问题描述】:

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

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

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

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

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

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

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

所以我再次生成了对特定提交 (sha) 的依赖项,就像 git submodule 一样,确保我可以签出旧提交并且项目应该运行。我现在可以在virtualenv 中安装所有内容并摆脱我的路径问题。太好了。

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

更笼统地说,根据我的设置,您是否看到了更好的解决方案?

【问题讨论】:

    标签: pip virtualenv setuptools project-structure tox


    【解决方案1】:

    据我所知,您的问题已基本解决,只剩下一小部分。

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

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

    【讨论】:

      猜你喜欢
      • 2016-05-06
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-05
      • 1970-01-01
      相关资源
      最近更新 更多