npm,pip,pipenv和诗歌包管理器之间的功能比较

npm,pip,pipenv和诗歌包管理器之间的功能比较,第1张

npm,pip,pipenv和诗歌包管理器之间的功能比较 Feature Package ManagernpmpippipenvpoetryAccess to main repo (i.e. Pypi/npm)✓✓✓✓Record top level dependencies✓✗Pipfilepyproject.tomlRecord development dependencies✓✗Pipfilepyproject.tomlLock versions of all dependencies✓✓Pipfile.lockpoetry.lockSwitch between interpreter versionsnvm✗✗✓Direct publishing✓✗✓*✓Run scripts✓✗Pipfile✗Editable local packages✓✓✓✓Integration with Intellij✓✓partial✗
  • pipenv
    如果使用第3方dev依赖项以及将其捆绑在一起的脚本,则可以直接与一起发布,请参见下文。

免责声明:我仅在’NIX系统(尤其是OSX)上拥有这些软件包管理器的经验,

pipenv
将Windows视为头等公民,这让我自己市场,我不确定在没有
pyenv
Windows的情况下它是如何工作的,就Windows而言,到目前为止我知道。

基本用法pipenv:

要充分利用

pipenv
pyenv
应安装。即使未激活,也
pipenv
将能够检测和使用随python安装的任何版本
pyenv
。例如,如果a
Pipfile
列出了python
3.4作为要求:要成功运行
pipenv install
pyenv install 3.4.0
应首先运行。

创建一个新的

Pipfile
venv(使用python 3.7.x):

>>> pipenv --python 3.7

Pipfile.lock
使用以下命令安装现有的依赖项。此命令还可用于创建
Pipfile
和venv(默认为最新的可用python版本)。

>>> pipenv install

要在创建的venv中运行命令:

>>> pipenv run <script or command>

例如

>>> pipenv run python main.py
诗歌

诗歌仍然在使用,

pyenv
但使用的方式有所不同:您必须在调用
poetry install
或之前激活要使用的python版本
poetry run

一个

pyproject.toml
可以使用创建的:

>>> poetry init

或可以使用以下方法创建完整的目录结构:

>>> poetry new <dir>

在安装之前,我们必须激活一个与

pyproject.toml
文件中指定内容匹配的python版本。

>>> pyenv global <python version specified in pyproject.toml>

现在,我们可以使用以下命令创建venv,如果存在

poetry.lock
文件,它将安装其中列出的所有依赖项。

>>> poetry install

要在创建的venv中运行命令:

>>> poetry run <command>

如果使用更改全局python版本

pyenv
,则将不再能够在创建的venv中运行命令。如果我们使用本地创建的venv,则有一个例外,请参见下文。

使用不同的python版本运行代码

有时,最好检查一下您的代码在python 3.7和python 3.4上都可以使用。这不是我们可以理所当然的事情。

吹牛

只有通过使用其他python版本重新创建venv才能删除它:

>>> rm -rf <path to venv>>>> pipenv --python <different python version>

可能会显示警告,表明venv的python版本与中指定的venv不匹配

Pipfile
,但据我所知,这仅仅是警告。

https://github.com/pypa/pipenv/issues/1071

诗歌

诗歌更适合此用例:可以并排创建多个venv。要使用来创建和使用新的venv开关python版本,

pyenv
然后创建一个新的venv。

>>> pyenv global <different python version>>>> poetry install

如果python版本与python中指定的版本不匹配,则会引发错误,

pyproject.toml
但是可以使用semver版本控制指定一系列python版本。

本地静脉

我更喜欢将venv安装在

.venv
项目本地的文件夹中,这类似于
npm
工作原理,并且允许我删除该文件夹并在发生任何奇怪的情况下或者如果我想轻松更改哪个版本(如果是pipenv的话)重新安装我正在使用的Python。

吹牛

要启用此功能:设置以下环境变量。

>>> export PIPENV_VENV_IN_PROJECT="enabled"
诗歌

可以使用以下命令启用此功能:

>>> poetry config settings.virtualenvs.in-project true

但是请注意,这将改变的行为

poetry
,将不再可能在不同版本的python之间进行快速切换:即使使用
pyenv
所有运行的命令切换了python版本,
poetryrun
也会使用venv(及其相关的python版本)驻留在本地目录中。

https://github.com/sdispater/poetry/issues/108

安装套件吹牛

软件包易于安装,

Pipfile
Pipfile.lock
可以使用以下方法自动添加到和文件中:

>>> pipenv install [--dev] <package name>

--dev
标志指示开发依赖性。使用时,默认情况下不会安装开发依赖项
pipenv install

也可以安装本地软件包,使您可以使用它们并立即查看更改:

>>> pipenv install -e <path to local package>
诗歌

软件包易于安装,

pyproject.toml
poetry.lock
可以使用以下方法自动添加到和文件中:

>>> poetry add [--dev] <package name>

--dev
标志指示开发依赖关系,在使用时默认情况下不会安装开发依赖关系,
poetry install
在发布时不会将其添加到程序包中。

也可以安装本地软件包,使您可以使用它们并立即查看更改:

>>> poetry add --path <path to local package> <name of package>

不确定为什么需要软件包名称,因为它应该已经由本地软件包定义。同样,作者似乎对一般情况下链接本地程序包不信服(https://github.com/sdispater/poetry/issues/34),因此随着时间的流逝,此功能可能会被遗忘。

运行脚本

为了清楚起见,我指的是

npm
所谓的脚本,这与
setup.py
文件内指定的脚本不同。

在开发时,有时为难以记住的命令设置快捷方式很有用,例如,用于运行目录中每个测试文件的命令为:

>>> python -m unittest discover -s <test_folder> -p '*_test.py'

拥有这些命令的快捷方式要方便得多。

吹牛

支持此功能:将以下内容放入

Pipfile

[scripts]    test = "pipenv run python -m unittest discover -s tests -p '*_test.py'"
诗歌

不支持,将来不太可能添加:https
:
//github.com/sdispater/poetry/pull/591#issuecomment-504762152

发布到PyPi

最好能够发布到PyPi而不编写其他

setup.py
文件,如果发布包所需的所有信息都包含在包管理文件中,则可能会这样做。

吹牛

据我所知,这是pipenv在哪里获得不良声誉的地方。

setup.py
仍然需要将文件发布到PyPi,不,它们不会自动使用的依赖项进行填充
Pipfile

推荐的方法是在发布时手动复制依赖项,或者获取Pipfile来安装

setup.py
文件中列出的依赖项,但是,
setup.py
运行时不会自动更新
pipenvinstall <package name>

如果您确实希望

Pipfile
依赖于
setup.py
文件,则可以这样做:

>>> pipenv install '-e .'

https://github.com/pypa/pipenv/issues/2805,https://realpython.com/pipenv-
guide/#yes-i-need-to-distribute-my-pre-as-a-
package,HTTPS
://github.com/pypa/pipenv/issues/209


因此,理想情况下,我们希望从中获取

setup.py
文件
Pipfile

我发现有两个声称可以做到这一点的软件包:

  1. https://pypi.org/project/pipenv-tools/-但是两年来没有更新,

    src
    目录中没有代码,我无法正常工作。

  2. https://pypi.org/project/pipenv-setup/-但是它同步

    Pipfile.lock
    而不是
    Pipfile
    ,这是一种反模式。锁定文件用于创建可重现的环境,它用于的限制过于严格(例如,不允许更新依赖项)
    setup.py
    。因此,我什至没有尝试使用它。


我的解决方案:

我迅速编写了一个程序包,该程序包生成

install_requires.py
可以导入
setup.py
文件的文件:https
:
//pypi.org/project/pipenv2setup/(在Windows上未经测试)。

有关在发布pipenv项目时如何使用软件包的示例,请参见以下github存储库:

https://github.com/alanbacon/pipenv示例

诗歌

用诗歌出版您的包裹真的很容易,您根本不需要

setup.py
文件。只需运行:

>>> poetry publish [--build] [--username <username>] [--password <password>]

不仅可以使用

pip
的其他实例来安装已发布的软件包
poetry

有关如何从使用文件迁移

setup.py
到纯
pyproject.toml
文件的信息,请参见此处:https : //johnfraney.ca/posts/2019/05/28/create-
publish-python-package-poetry/

IntelliJ或Pycharm集成吹牛

Pycharm可以通过使用

Piplock
文件来检测venv ,但是使用Pycharm界面添加新软件包不会修改
Piplock
文件。

诗歌

在撰写本文时,Pycharm似乎并不了解任何诗歌虚拟环境,或似乎无法

pyproject.toml
以任何方式解析文件。

关于诗歌的其他要点森弗

在其中,

poetry
您必须使用semver(必须使用
~
^
,而不是
>=

<
)https://nodesource.com/blog/semver-tilde-and-
caret指定python和软件包的版本。

蓬松度

poetry
使用python运行,但不适用于旧版本的python。因此,要开发旧版本的python:必须将某些命令
pyenv
设置为>
3.6,然后将
pyenv
其切换回旧版本以创建venv。看来venvs必须大于3.5。
https://github.com/sdispater/poetry/issues/1223

也不确定Windows的兼容性

poetry

结论

对我而言,

poetry
和之间的主要区别
pipenv
在于它们对的使用
pyenv
以及它们直接发布到的能力(或缺乏)
PyPi
poetry
我个人也觉得缺乏脚本感到沮丧。

我发现使用时

poetry
,在python环境之间使用时会有更多切换
pyenv
。尽管当前可以通过使用本地安装venv来缓解这种情况。我知道这限制了我在不同的python环境中快速测试代码的能力,但是还有其他工具
tox
可以做到这一点。

发布

PyPi
使用
poetry
非常容易,我在上面一行中做了解释。与
PyPi
一起发布
pipenv
是一个雷区,要说明这一点,我不得不链接到整个git
repo(上文)。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5646165.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-16
下一篇 2022-12-16

发表评论

登录后才能评论

评论列表(0条)

保存