我们正在 Python 中启动一个新项目,其中包含一些我们希望保密的专有算法和敏感逻辑。我们还将有一些局外人(选定的公众成员)来编写代码。我们不能授予外部人员访问小型私有代码的权限,但我们希望公共版本能够为他们提供足够好的工作。
假设我们的项目 Foo 有一个模块 ,bar
具有一个功能,get_sauce()
。真正发生的事情get_sauce()
是秘密的,但我们想要一个公共版本的get_sauce()
返回一个可接受的,尽管不正确的结果。
我们还运行我们自己的 Subversion 服务器,因此我们可以完全控制谁可以访问什么。
符号链接
我的第一个想法是符号链接——而不是bar.py
,只提供bar_public.py
给所有人和bar_private.py
内部开发人员。不幸的是,创建符号链接是一项繁琐的手动工作——尤其是当这些私有模块确实有大约两打时。
更重要的是,它使 Subversion authz 文件的管理变得困难,因为对于我们想要保护的每个模块,都必须在服务器上添加一个异常。有人可能会忘记这样做并且不小心签入了秘密......然后模块在 repo 中,我们必须在没有它的情况下重建存储库,并希望外人在此期间没有下载它。
多个存储库
下一个想法是拥有两个存储库:
private
└── trunk/
├── __init__.py
└── foo/
├── __init__.py
└── bar.py
public
└── trunk/
├── __init__.py
└── foo/
├── __init__.py
├── bar.py
├── baz.py
└── quux.py
这个想法是只有内部开发人员才能同时签出private/
和public/
. 内部开发人员会设置他们的PYTHONPATH=private/trunk:public/trunk
,但其他人只会设置PYTHONPATH=public/trunk
。那么,内部人员和外部人员都from foo import bar
可以获得正确的模块,对吗?
让我们试试这个:
% PYTHONPATH=private/trunk:public/trunk python
Python 2.5.1
Type "help", "copyright", "credits" or "license" for more information.
>>> import foo.bar
>>> foo.bar.sauce()
'a private bar'
>>> import foo.quux
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named quux
我不是 Python 专家,但似乎 Python 已经决定了模块foo
和与之相关的搜索:
>>> foo
<module 'foo' from '/path/to/private/trunk/foo/__init__.py'>
甚至删除都没有foo
帮助:
>>> import sys
>>> del foo
>>> del sys.modules['foo']
>>> import foo.quux
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named quux
你能给我一个更好的解决方案或建议吗?