2017-05-08 10 views
1

requirements.txtが変更された場合のみ、ターゲットmake installを実行するにはどうすればよいですか?Makefileだけでrequire.txtをインストールすると、python requirements.txtが変更される

私はパッケージをアップグレードしたくない私はmake install

を行うたびに私は、偽のファイル_requirements.txt.pycを作成することによって、いくつかの回避策を見つけたが醜い汚れです。

私は
. 
├── Makefile 
├── README.rst 
├── lambda_handler.py 
└── requirements.txt 

# first time, 
$ make install # create virtual environment, install requirements 

# second time 
$ make install # detected and skipping creating virtual env, 
       # detect that requirements.txt have no changes 
       # and skipping installing again all python packages 
make: Nothing to be done for 'install'. 

Pythonパッケージは、次のようになります。requirements.txtは何も変更

$ make install-pip-requirements 
make: Nothing to be done for 'install-pip-requirements'. 

を持っていませんが、私の目標が何をしているので、それはピップ要件をもう一度インストールを拒否しますファイルを使用して、Makefile、いくつかの自動化のためのPython:

/opt/virtual_env: 
    # create virtual env if folder not exists 
    python -m venv /opt/virtual_env 

virtual: /opt/virtual_env 

# if requirements.txt is modified than execute pip install 
_requirements.txt.pyc: requirements.txt 
    /opt/virtual_env/bin/pip install -r --upgrade requirements.txt 
    echo > _requirements.txt.pyc 

requirements: SOME MAGIG OR SOME make flags   
    pip install -r requirements.txt 

install-pip-requirements: _requirements.txt.pyc 

install: virtual requirements 

私は

はこれを行うには

より良い方法でなければならないことを確信しています;)それは、この時点では、あなたの質問にお答えします

+0

あなたのpythonパッケージの外観をもっと詳しく説明できますか?任意の種類のPythonプロジェクトテンプレートを使用していますか?なぜsudoでmakeを実行するのですか? – ovanes

+0

が@ovanes用に更新され、フォルダツリーが追加され、問題に関連していないためsudoが削除されました(私がrootであると仮定)。 –

答えて

3

わかりません。より良い方法は、本格的なPython PIPプロジェクトテンプレートを使用することです。

cookiecutter templateを使用して特定のpipパッケージを作成するには、cookiecutterを使用します。

すべての依存関係を絶えず再インストールしないMakefileがあり、Python toxを使用しています。これにより、さまざまなpython envでプロジェクトテストを自動的に実行できます。あなたはまだdev virtualenvで開発することができますが、新しいパッケージが追加された場合にのみ更新します。それ以外はすべてtoxで処理されます。

しかし、これまでに示してきたことは、Pythonビルドを最初から作成しようとしていることです。これは、多数のプロジェクトテンプレートで完了しました。実際に何が起こっているのかを理解したい場合は、these templatesを分析することができます。フォローとして


:あなたはそれがメイクファイルで動作するように期待していますので、私はPIPコマンドから--upgradeフラグを削除することをお勧めしたいです。あなたの要件には、プロジェクトの作業に必要なバージョンが含まれていないと思われます。私たちは、バージョンを置いておかないと事態を悪くするかもしれないという経験をしました。したがって、私たちのrequirements.txtは、次のようになります。--upgrade原因なし要件を使用して

configure==0.5 
falcon==0.3.0 
futures==3.0.5 
gevent==1.1.1 
greenlet==0.4.9 
gunicorn==19.4.5 
hiredis==0.2.0 
python-mimeparse==1.5.2 
PyYAML==3.11 
redis==2.10.5 
six==1.10.0 
eventlet==0.18.4 

単にvirtualenvのであり、何でないものを確認してくださいピップ。必要なバージョンを満たすものはすべてスキップされます(ダウンロードなし)。

-e git+http://some-url-here/path-to/[email protected]#egg=package-name-how-to-appear-in-pip-freeze 
+0

私は理由を知らないが、私はまだ私がより良い方法https://youtu.be/wf-BqAjZb8M?t=1390する必要がありますと思う。私はmakefileの解決策を期待しています:( –

+0

@ Andrei.Danciuc:OK、 'requirements.txt'にバージョン管理を導入することで、2番目の選択肢を提案しました。 – ovanes

0

@Andrei:あなたはそのような要件のGitのバージョンをも参照することができます。Danciuc、makeは比較するのに2つのファイルが必要です。 pip installからの出力ファイルを使用できます。

は、例えば、私は通常「vendored」フォルダを使用するので、私は「vendored」へのパスを別名設定できる代わりにダミーファイルを使用したフォルダ。

# Only run install if requirements.txt is newer than vendored folder 
vendored-folder := vendored 
.PHONY: install 
install: $(vendored-folder) 

$(vendored-folder): requirements.txt 
    rm -rf $(vendored-folder) 
    pip install -r requirements.txt -t $(vendored-folder) 

あなたがvendoredフォルダを使用しない場合は、以下のこのコードはvirtualenvのとグローバルな設定の両方のために働く必要があります。

# Only run install if requirements.txt is newer than SITE_PACKAGES location 
.PHONY: install 
SITE_PACKAGES := $(shell pip show pip | grep '^Location' | cut -f2 -d':') 
install: $(SITE_PACKAGES) 

$(SITE_PACKAGES): requirements.txt 
    pip install -r requirements.txt 
関連する問題