私たちは、非公開にしたいいくつかの独自のアルゴリズムと機密性の高いロジックを使用して、Python で新しいプロジェクトを開始しています。また、コードに取り組んでいる数人の部外者 (一般の一部のメンバー) も参加します。部外者にコードの小さなプライベート ビットへのアクセスを許可することはできませんが、パブリック バージョンが十分に機能することを望んでいます。
私たちのプロジェクト Foo には、bar
1 つの関数 を持つモジュール があるとしますget_sauce()
。で実際に何が起こるかget_sauce()
は秘密ですが、 の公開バージョンがget_sauce()
、間違っていても許容できる結果を返すことを望んでいます。
また、独自の Subversion サーバーを実行しているため、誰が何にアクセスできるかを完全に制御できます。
シンボリックリンク
私が最初に考えたのはシンボリック リンクでしbar.py
た。残念ながら、シンボリック リンクの作成は面倒な手作業です。特に、これらのプライベート モジュールが実際に 20 個ほどになる場合はなおさらです。bar_public.py
bar_private.py
さらに重要なことに、Subversion authz ファイルの管理が難しくなります。これは、保護したいモジュールごとに例外をサーバーに追加する必要があるためです。誰かがこれを行うのを忘れて、誤ってシークレットをチェックインする可能性があります...その後、モジュールはリポジトリにあり、それなしでリポジトリを再構築する必要があり、その間に部外者がそれをダウンロードしないことを願っています.
複数のリポジトリ
次に考えたのは、2 つのリポジトリを用意することでした。
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
より良い解決策や提案を教えていただけますか?