我写了一个python模块。它存在于一个回购中。现在要让模块运行的单元测试,它们不能是该模块的子文件夹。建议的结构是:
ModuleRepo/
MyModule/
__init__.py
some_utils.py
import .some_helpers
some_helpers.py
Tests/
some_utils_test.py
import MyModule.some_utils
some_helpers_test.py
import MyModule.some_helpers
现在工作得很好。如果我运行测试,他们可以导入模块。该模块能够通过预先挂起的'。'导入自己的文件(例如:some_helpers)。表示本地文件夹。
问题是现在有一个不同的仓库要共享这个模块,我不知道如何让它找到模块。
例如:
ModuleRepo/
MyModule/
__init__.py
...
Tests/
...
AnotherRepo/
using_my_module.py
import ??? <-- how to find MyModule?
没有尝试#1: 我最初尝试使用git的子模块功能将ModuleRepo包含在AnotherRepo下。但是我实际上并不想要ModuleRepo的 root 文件夹,我只想要子文件夹'MyModule'。事实证明,git的子模块不能做到这一点 - 只能选择一个repo的一部分来包含。
难以理解的SYMLINK:虽然符号链接可能有效,但它不能“提交”到存储库,因此有些不受欢迎。另外我在Windows和Linux上都在开发,所以我需要一个适用于它们的解决方案。
可能的解决方案:将ModuleRepo root也转换为模块(添加 init .py)。然后我可以使用git使它成为AnotherRepo的子模块。我的导入会很丑,但它会是:import my.module.some_utils而不是import mymodule.some_utils
有没有人有更好的解决方案?
答案 0 :(得分:2)
几种可能性。
调整sys.path
在代码顶层的某处变量,以便在那里列出ModuleRepo
目录。
好处是,这种方法适用于您可以使用的任何解决方案 使用将这两个存储库放在一起 - 就是这样 子模块或子树合并。
缺点是你需要重复这个调整
using_my_module.py
中代码的测试单元。
使用virtualenv
发展。
为项目设置开发环境的一部分 将安装&#34; MyModule&#34; &#34;常规方式&#34;。
如果&#34; MyModule&#34;模块没有变化和/或你没事
手册定期纳入正在发生的事态发展
在&#34; MyModule&#34;进入你的&#34;主要&#34;代码库,您可以使用所谓的&#34; vendoring&#34;通过使用git subtree split
和
git subtree add
命令(或所谓的&#34;子树合并&#34;相反
后者)。
基本上,git subtree split
命令允许您
提取出回购托管&#34; MyModule&#34;
合成历史图表,仅包含触摸的提交
指定前缀下的文件 - &#34; MyModule&#34;,在您的情况下,
并且git subtree add
允许您&#34;子树合并&#34;那个子图
在另一个存储库中的指定前缀。