首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何记录需求

如何记录需求
EN

Stack Overflow用户
提问于 2020-01-26 15:07:44
回答 2查看 257关注 0票数 1

当我编程时,我经常用第三方软件包进行实验。当然,它们是通过pip安装的。安装后,包将安装它们的依赖项。

最后,我希望有一个干净的requirements.txt,它反映了项目真正需要的包(pip冻结> requirements.txt)。

如果我设法找到一个更好的软件包解决方案,我会通过pip卸载它。问题是,当卸载时,包不会卸载它的依赖项。如果我没有弄错的话,这就不是了。嗯,当我让pip冻结的时候,我不知道这里发生了什么。

因此,我决定记录下安装了哪个软件包。卸载时,我会手动卸载它们。

但这确实很麻烦,而且容易出错:

代码语言:javascript
复制
pip freeze > requirements.txt

asgiref==3.2.3
Django==3.0.2
pkg-resources==0.0.0
pytz==2019.3
sqlparse==0.3.0

编辑requirements.txt:

代码语言:javascript
复制
asgiref==3.2.3 # Django dependency
Django==3.0.2 # Django
pkg-resources==0.0.0 # Default package
pytz==2019.3 # Django dependency
sqlparse==0.3.0 # Django dependency

当我安装一个新的软件包时,我会使pip冻结>Requiments1.txt。然后比较这些文件,显示新安装的包的依赖项,标记它们,然后复制粘贴旧注释。

好吧,最后我可以把它弄得一团糟。我让点子冻结,并明白,我只是不知道哪个包取决于哪个,因为我只是忘了发表我的意见或什么。

这也是我的目标:当我在一年内完成我的项目时,我想确切地知道:

  1. 每个已安装的包对于项目的运行都是绝对必要的。
  2. 没有安装任何不必要的软件包。

你能告诉我什么是最好的做法吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-26 16:26:59

pip-工具似乎正是解决您在开发工作流程中遇到的问题所需要的工具。

pip-tools使您能够指定高级别依赖项(例如Django),同时自动处理低级别依赖项(例如pytz)。它还使您能够将您的环境同步到一个requirements.txt文件,而不管您可能有什么混乱的状态。

在项目中安装pip-tools

要使用pip-tools,首先在项目中创建一个新的空Python虚拟环境,并使用您选择的工具激活它:

  • 使用文夫 (内置):python3 -m venv .venv && source .venv/bin/activate
  • 使用碧昂夫pyenv virtualenv 3.8.1 project-env && pyenv local project-env

然后,在项目的Python虚拟环境中安装pip-tools

  • pip install pip-tools

使用pip-compile使用requirements.in文件管理依赖项

pip-tools包括一个以requirements.in文件作为输入的pip-compile工具。这个requirements.in文件类似于requirements.txt,但它只包含较高级别的依赖项。例如,如果您的项目使用的是Django的最新版本,您可以在requirements.in中编写类似的内容

代码语言:javascript
复制
django>=3.0,<3.1

您可以看到,requirements.in不包含Django的依赖项,只包含Django本身。

requirements.in中设置了依赖项之后,使用pip-compilerequirements.in“编译”为requirements.txt文件:

代码语言:javascript
复制
➜ pip-compile requirements.in
#
# This file is autogenerated by pip-compile
# To update, run:
#
#    pip-compile requirements.in
#
asgiref==3.2.3            # via django
django==3.0.2
pytz==2019.3              # via django
sqlparse==0.3.0           # via django

requirements.txt生成的pip-compile文件指示包名旁边的每个间接依赖项的来源。例如,pytz==2019.3django的依赖项。此外,它还将每个依赖项固定在一个精确的版本号上,以确保您的依赖项的安装是可重复的。

将生成的requirements.txt的依赖项应用于pip-sync

既然您有了一个requirements.txt,就可以使用pip-sync在您的Python虚拟环境中应用它了。

代码语言:javascript
复制
➜ pip-sync requirements.txt
Collecting asgiref==3.2.3 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 1))
  Using cached https://files.pythonhosted.org/packages/a5/cb/5a235b605a9753ebcb2730c75e610fb51c8cab3f01230080a8229fa36adb/asgiref-3.2.3-py2.py3-none-any.whl
Collecting django==3.0.2 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 2))
  Using cached https://files.pythonhosted.org/packages/55/d1/8ade70e65fa157e1903fe4078305ca53b6819ab212d9fbbe5755afc8ea2e/Django-3.0.2-py3-none-any.whl
Collecting pytz==2019.3 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 3))
  Using cached https://files.pythonhosted.org/packages/e7/f9/f0b53f88060247251bf481fa6ea62cd0d25bf1b11a87888e53ce5b7c8ad2/pytz-2019.3-py2.py3-none-any.whl
Collecting sqlparse==0.3.0 (from -r /var/folders/r1/n_n031s51wz2gjwy7mb9k4rh0000gn/T/tmpvhv549si (line 4))
  Using cached https://files.pythonhosted.org/packages/ef/53/900f7d2a54557c6a37886585a91336520e5539e3ae2423ff1102daf4f3a7/sqlparse-0.3.0-py2.py3-none-any.whl
Installing collected packages: asgiref, pytz, sqlparse, django
Successfully installed asgiref-3.2.3 django-3.0.2 pytz-2019.3 sqlparse-0.3.0

通过卸载和安装相关的软件包,pip-sync将确保您的虚拟环境与requirements.txt文件中定义的内容完全一致。

在您的环境被同步之后,确保您的项目代码正常工作。如果是的话,将requirements.inrequirements.txt提交到版本控制中。

参考文献

有关更多细节,您可以参考pip工具文档或Hynek:2018年Python应用程序依赖关系管理的文章。

票数 3
EN

Stack Overflow用户

发布于 2020-01-26 15:40:31

依赖关系管理在python领域比其他地方要粗糙一些,有一些像诗歌和pipenv这样的工具,但是仅仅为了戳一圈,我会尝试下面的方法。

  1. 在项目目录中创建虚拟环境 $ python3 -m venv .venv
  2. 激活您的虚拟环境 $ source . .venv/bin/activate
  3. 安装您正在使用的任何软件包 $ echo "package1“>> requirements-dev.txt $package2 "package2”>> requirements-dev.txt $ pip安装-升级-r需求-dev.txt
  4. 当您认为您拥有所需的一切时,请关闭您的虚拟env,创建一个新的env,确保所有操作仍然正常,然后创建您的新requirements.txt。 $ rm -rf .venv $ python3 -m venv .venv $ pip .venv--升级-r需求-dev.txt#测试您的代码仍然工作#创建一个新的需求文件用于"prod“$ pip .venv> requirements.txt

我不认为这是最佳实践,但这是一个开始,应该让您在决定在dep管理工具方面加入哪个方面之前:)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59919609

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档