如果需要更改requirements.txt,我该如何运行目标make install
?
我每次执行make install
我通过创建假文件_requirements.txt.pyc
找到了一些解决方法,但丑陋和脏。它会第二次拒绝安装pip要求,因为requirements.txt没有变化
$ make install-pip-requirements
make: Nothing to be done for 'install-pip-requirements'.
但我的目标是:
# 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包看起来像:
.
├── Makefile
├── README.rst
├── lambda_handler.py
└── requirements.txt
我正在使用文件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 :(得分:3)
目前还不确定它会回答你的问题。更好的方法是使用完全成熟的Python PIP项目模板。
我们使用cookiecutter使用此cookiecutter template创建特定的pip包。
它有一个Makefile,它不会不断地重新安装所有依赖项,它使用Python tox,它允许自动在不同的python环境中运行项目测试。您仍然可以在dev virtualenv中进行开发,但我们只在添加新包时更新它,其他所有内容都由tox处理。
但是,到目前为止您所展示的是尝试从头开始编写Python构建,这是通过众多项目模板完成的。如果你真的想了解那里发生了什么,你可以分析these templates。
作为后续:因为您希望它与makefile一起使用,我建议从pip命令中删除--upgrade
标志。我怀疑您的要求不包含项目工作所需的版本。我们提供了一种体验,即不会将版本放在那里可能会严重制动。因此我们的requirements.txt
看起来像:
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
使用不带--upgrade
的要求会导致pip只是验证virtualenv中的内容以及不是什么。将跳过满足所需版本的所有内容(无需下载)。您还可以在以下要求中引用git版本:
-e git+http://some-url-here/path-to/repository.git@branch-name-OR-commit-id#egg=package-name-how-to-appear-in-pip-freeze
答案 1 :(得分:0)
@ Andrei.Danciuc,make
只需要两个文件进行比较;您可以使用运行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)
如果您不使用已售出的文件夹,则此代码适用于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