从 Azure DevOps Python 工件提要不工作的 pip 安装

pip install from Azure DevOps Python Artifacts feed not working

当我尝试从 Azure DevOps Artifacts 源安装包时,出现错误:

Looking in indexes: https://pypi.org/simple, https://pkgs.dev.azure.com/company/company_Software/_packaging/PyPI/pypi/simple/
ERROR: Could not find a version that satisfies the requirement as-api (from versions: none)
ERROR: No matching distribution found for as-api

由于使用 pip install -vvv 可能会产生机密信息,因此我无法在此处提供完整的日志。请随时询问有关日志的任何具体问题。同时,我可以看到有希望的消息,例如:

Found index url https://pkgs.dev.azure.com/company/company_Software/_packaging/PyPI/pypi/simple/
Getting credentials from keyring for https://pkgs.dev.azure.com/company/company_Software/_packaging/PyPI/pypi/simple/

还有一些有问题的消息?:

Status code 302 not in (200, 203, 300, 301)
Skipping link: not a file: ...
Given no hashes to check 0 links for project 'as-api': discarding no candidates

复制细节

virtualenv .venv
.\.venv\Scripts\activate
python -m pip install -U pip
pip install keyring artifacts-keyring
pip install as-api

link 用于生成发布包的管道以及安装包的建议方式。我的方法现在是选项 1 和选项 2 的混合。注意使用 php.ini 文件来设置 --index-urlartifacts-keyring 包(安装 --pre 不会对版本有任何影响),所以它真的没有任何影响。但是,我已经分别尝试了这两个选项,它不会生成浏览器,所以它给出了相同的结果。

系统详情:

pip list
Package           Version
----------------- ----------
artifacts-keyring 0.2.8rc0
certifi           2019.11.28
chardet           3.0.4
configparser      4.0.2
entrypoints       0.3
idna              2.8
keyring           18.0.1
pip               19.3.1
pywin32-ctypes    0.2.0
requests          2.22.0
setuptools        42.0.2
urllib3           1.25.7
wheel             0.33.6

文件夹结构:

test
  |-- test.py
  |-- .venv
         |-- pip.ini
         |-- ... other virtualenv folders and files

pip.ini:

[global]
extra-index-url = https://pkgs.dev.azure.com/company/company_Software/_packaging/PyPI/pypi/simple/

进一步分析

As a workaround:

看起来您正在使用 option2 from the document to do the install. I happen to see one similar issue,这表明此错误消息可能与 pip.ini(windows) 或 pip.conf(linux/mac), 所以我认为你可以尝试另一种方法来避免这些配置出现问题。

您可以 运行 pip install artifacts-keyring --pre 然后 运行

pip install packageName --index-url https://pkgs.dev.azure.com/xxx/xxx/_packaging/xxx/pypi/simple/ -vvv --no-deps

当 运行ning 命令 pip install artifacts-keyring --pre:

时,你会遇到这样的事情

登录通过后,如果您的 Feed 中存在您需要的包,您将获得该包。

修复

执行以下操作之一:

  • 去掉VSS_NUGET_EXTERNAL_FEED_ENDPOINTS环境变量(用处不大,不推荐)

  • VSS_NUGET_EXTERNAL_FEED_ENDPOINTS 环境变量添加一个额外的 endpoint。例如,

{"endpointCredentials": [{"endpoint":"https://pkgs.dev.azure.com/company/_packaging/NuGetFeed/nuget/v3/index.json", ...},{"endpoint":"https://pkgs.dev.azure.com/company/company_Software/_packaging/PyPI/pypi/simple/", ...}]}

我们有一个脚本可以设置这些端点,所以这是一个简单的修复。

原因

事实证明,如果您使用了 artifacts-credprovider to set up another feed, in our case, a NuGet feed with another endpoint, the VSS_NUGET_EXTERNAL_FEED_ENDPOINTS environment variable stores only that feed URL inside the key endpoint. artifacts-keyring,即使 endpoint 不存在,它仍然会读取该环境变量,这会导致身份验证问题。 -vvv 日志不会告诉您有关身份验证的任何信息,也不会尝试使用其他方法进行身份验证。

我的问题是我没有安装 artifacts-keyring。之后我可以看到 VS Code 对提要进行身份验证并安装包。

我还需要使用以下命令升级 pip(需要高于 19.2):

python -m pip install --upgrade pip

假设您的 Azure DevOps 工件是私有的并且您有一个 PAT 然后可以通过以下两种方式从工件安装包

  1. 如果您可以访问终端(仅在开发环境中首选)
pip install https://<your-feed-name>:<your-PAT-key>@pkgs.dev.azure.com/<your-organization-name>/<your-project-name>/_packaging/<your-feed-name>/pypi/simple/ Your-Package-Name==x.x.x

注意:所有名称(例如:feed、project)必须遵循 HTTPS URL convention.A 简单(且实际上正确)的方式来获取要知道 URL 是转到 Artifacts --> Select 你的 artifact feed --> 连接到 feed --> PIP --> 在这里你会得到正确的 URL。此外,在 URL

中的两个位置都使用一些提要名称
  1. 使用 requirements.txt(这将非常适合用于产品或 CI/CD 管道)并使流程自动化:

请注意,它需要一些 string/URL 操作。按照以下方式在您的 requirements.txt 中添加相应的 line/URL:

  • URL 与早期终端方法
  • 中使用的早期 URL 非常相似
  • 在URL之后simple一切都要改,修改URL-
https://<your-feed-name>:<your-PAT-key>@pkgs.dev.azure.com/<your-organization-name>/<your-project-name>/_packaging/<your-feed-name>/pypi/download/<yourpackagename>/<package version>/Your-Package-Name.whl 
#assuming your package is a .whl file
  • 所以simple改为download;那么无论你的包名是什么,无论它是否包含'-'或'_'或CAPS,所有内容都将被删除并转换为小写。
  • 接下来是您要安装的软件包的版本号,最后是 wheel 或 .whl 文件的名称。

作为对@user:10097045 的回答的更新

您必须在选项1中的路径URL前面添加--extra-index-url=,否则pip将无法找到目录

否则答案非常有帮助,您只是得到一个没有该定义的 404