从 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-url
和 artifacts-keyring
包(安装 --pre
不会对版本有任何影响),所以它真的没有任何影响。但是,我已经分别尝试了这两个选项,它不会生成浏览器,所以它给出了相同的结果。
系统详情:
- OS: Windows 10
- Python 2.7.17
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/
进一步分析
使用干净的笔记本电脑实际上可以处理上述再现细节。公司其他电脑也出现同样的问题,所以我们的部分设置与认证冲突
如果我们使用管道(见这个link)来安装as-api
包,它可以工作,所以我怀疑这是一个身份验证问题,但没有提到在任何文件上。
使用https://username:password@...不会出现任何身份验证错误,即使用户名和密码错误。
使用正确的用户名但密码中有符号会触发交互模式以输入用户名和密码。但是,这会出现此错误:WARNING: 401 Error, Credentials not correct for https://pkgs.dev.azure.com/company/company_Software/_packaging/PyPI/pypi/simple/as-api/
请注意,我是 Artifacts 提要的所有者,并且已将团队添加为权限选项卡中的所有者。
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 然后可以通过以下两种方式从工件安装包
- 如果您可以访问终端(仅在开发环境中首选)
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
中的两个位置都使用一些提要名称
- 使用
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
当我尝试从 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-url
和 artifacts-keyring
包(安装 --pre
不会对版本有任何影响),所以它真的没有任何影响。但是,我已经分别尝试了这两个选项,它不会生成浏览器,所以它给出了相同的结果。
系统详情:
- OS: Windows 10
- Python 2.7.17
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/
进一步分析
使用干净的笔记本电脑实际上可以处理上述再现细节。公司其他电脑也出现同样的问题,所以我们的部分设置与认证冲突
如果我们使用管道(见这个link)来安装
as-api
包,它可以工作,所以我怀疑这是一个身份验证问题,但没有提到在任何文件上。使用https://username:password@...不会出现任何身份验证错误,即使用户名和密码错误。
使用正确的用户名但密码中有符号会触发交互模式以输入用户名和密码。但是,这会出现此错误:
WARNING: 401 Error, Credentials not correct for https://pkgs.dev.azure.com/company/company_Software/_packaging/PyPI/pypi/simple/as-api/
请注意,我是 Artifacts 提要的所有者,并且已将团队添加为权限选项卡中的所有者。
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 然后可以通过以下两种方式从工件安装包
- 如果您可以访问终端(仅在开发环境中首选)
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
中的两个位置都使用一些提要名称- 使用
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