Công cụ thiết lập Python: Làm cách nào để liệt kê một kho lưu trữ riêng trong install_requires?


83

Tôi đang tạo một setup.pytệp cho một dự án phụ thuộc vào các kho lưu trữ GitHub riêng tư. Các phần có liên quan của tệp trông như thế này:

from setuptools import setup
setup(name='my_project',
    ...,
    install_requires=[
        'public_package',
        'other_public_package',
        'private_repo_1',
        'private_repo_2',
    ],
    dependency_links=[
        'https://github.com/my_account/private_repo_1/master/tarball/',
        'https://github.com/my_account/private_repo_2/master/tarball/',
    ],
    ...,
)

Tôi đang sử dụng setuptoolsthay distutilsvì vì sau này không hỗ trợ đối số install_requiresdependency_linkscho mỗi câu trả lời này .

Tệp thiết lập ở trên không thể truy cập các kho lưu trữ riêng tư với lỗi 404 - điều này được mong đợi vì GitHub trả về 404 cho các yêu cầu trái phép đối với kho lưu trữ riêng tư. Tuy nhiên, tôi không thể tìm ra cách setuptoolsxác thực.

Đây là một số điều tôi đã thử:

  1. Sử dụng git+ssh://thay vì https://trong dependency_linksnhư tôi sẽ làm nếu cài đặt repo với pip. Điều này không thành công vì setuptools không nhận ra giao thức này ("loại url không xác định: git + ssh"), mặc dù tài liệu phân phối cho biết điều đó nên làm. Ditto git+httpsgit+http.

  2. https://<username>:<password>@github.com/...- vẫn nhận được 404. (Phương pháp này cũng không hoạt động với curlhoặc wgettừ dòng lệnh - mặc dù curl -u <username> <repo_url> -O <output_file_name>nó hoạt động.)

  3. Nâng cấp setuptools (0.9.7) và virtualenv (1.10) lên phiên bản mới nhất. Cũng đã thử cài đặt phân phối mặc dù tổng quan này cho biết nó đã được hợp nhất trở lại vào setuptools. Dù bằng cách nào, không có xúc xắc.

Hiện tại, tôi vừa setup.pyin ra một cảnh báo rằng repo riêng tư phải được tải xuống riêng. Điều này rõ ràng là ít hơn lý tưởng. Tôi cảm thấy như có điều gì đó hiển nhiên mà tôi đang thiếu, nhưng không thể nghĩ nó có thể là gì. :)

Câu hỏi trùng lặp không có câu trả lời ở đây .


Hãy chấp nhận một giải pháp.
wieczorek1990 Ngày

Câu trả lời:


64

Tôi đã cố gắng làm cho điều này hoạt động để cài đặt bằng pip, nhưng ở trên không hoạt động với tôi. Từ [1], tôi hiểu PEP508tiêu chuẩn nên được sử dụng, từ [2] tôi lấy ra một ví dụ thực sự hoạt động (ít nhất là đối với trường hợp của tôi).

Xin lưu ý; đây là với pip 20.0.2trênPython 3.7.4

setup(
    name='<package>',
...
    install_requires=[
        '<normal_dependency>',
         # Private repository
        '<dependency_name> @ git+ssh://git@github.com/<user>/<repo_name>@<branch>',
         # Public repository
        '<dependency_name> @ git+https://github.com/<user>/<repo_name>@<branch>',
    ],
)

Sau khi chỉ định gói của tôi, cài đặt này hoạt động tốt (cũng với -ecài đặt và không cần chỉ định --process-dependency-links).

Tài liệu tham khảo [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566


Phần #egg=...có vẻ không cần thiết bây giờ.
Huazuo Gao

1
Cảm ơn! Bạn hoàn toàn đúng, cả hai #eggbranchđều là tùy chọn (xem chỉnh sửa) và nó cũng hoạt động cho git+https.
Tom Hemmes

1
Nếu bạn sử dụng ssh://và gặp Could not resolve hostnamesự cố, hãy thay đổi :thành /trong url bản sao của bạn. Tôi đã gặp lỗi này với gitlab.
Delijati

11
Điều đó dường như không hoạt động nữa vì setuptools dường như tìm kiếm một gói trên PyPi với tên phụ thuộc: Reading https://pypi.org/simple/some-fake-name/và sau đó Couldn't find index page for 'some_fake_name' (maybe misspelled?). Cuối cùng, lỗi cuối cùng được hiển thị làerror: Could not find suitable distribution for Requirement.parse('some_fake_name@ git+ssh://git@github.com/cglacet/quadtree.git')
cglacet

1
Nhấn mạnh rằng <dependency_name> là không giống như thẻ <repo_name> VÀ bạn có thể thay thế 'ssh: // git @' với 'https: //' nếu nó là một repo công cộng
Phil P

41

Đây là những gì đã làm việc cho tôi:

  install_requires=[
      'private_package_name==1.1',
  ],
  dependency_links=[
      'git+ssh://git@github.com/username/private_repo.git#egg=private_package_name-1.1',
  ]

Lưu ý rằng bạn phải có số phiên bản trong tên trứng, nếu không nó sẽ báo không thể tìm thấy gói.


3
Xin chào vadimg - Bạn đang sử dụng phiên bản setuptools / phân phối nào? Tôi nhận được "Loại url không xác định: git + ssh" bằng cách sử dụng phân phối 0.7.3 (phiên bản mới nhất).
Eric P

2
Điều này không làm việc cho tôi 3 năm sau ... Chấn: Không thể tìm thấy một phiên bản đó đáp ứng yêu cầu
jsmedmar

7
Kể từ ngày 28 tháng 10 năm 2016, phương pháp này có vẻ bị hỏng
Tối đa

1
Với pip hiện đại là bạn cần bao gồm một lựa chọn, một cái gì đó giống nhưpip install --process-dependency-links ...
Ash Berlin-Taylor

2
--process-dpendency-linkskhông được dùng nữa, hãy xem câu trả lời của tôi bằng cách sử dụng đặc điểm kỹ thuật url PEP508
Tom Hemmes

10

Tôi không thể tìm thấy bất kỳ tài liệu tốt nào về vấn đề này, nhưng tìm ra giải pháp chủ yếu thông qua thử nghiệm và lỗi. Hơn nữa, cài đặt từ pip & setuptools có một số khác biệt nhỏ; nhưng cách này sẽ hiệu quả cho cả hai.

GitHub không (hiện tại, kể từ tháng 8 năm 2016) cung cấp một cách dễ dàng để lấy zip / tarball của các kho lưu trữ riêng tư. Vì vậy, bạn cần trỏ setuptools để cho các setuptools biết rằng bạn đang trỏ đến một git repo:

from setuptools import setup
import os
# get deploy key from https://help.github.com/articles/git-automation-with-oauth-tokens/
github_token = os.environ['GITHUB_TOKEN']

setup(
    # ...
    install_requires='package',
    dependency_links = [
    'git+https://{github_token}@github.com/user/{package}.git/@{version}#egg={package}-0'
        .format(github_token=github_token, package=package, version=master)
        ] 

Một vài lưu ý ở đây:

  • Đối với các repos riêng tư, bạn cần xác thực bằng GitHub; cách đơn giản nhất mà tôi tìm thấy là tạo mã thông báo oauth, thả mã đó vào môi trường của bạn, sau đó đưa nó vào URL
  • Bạn cần bao gồm một số phiên bản (đây là 0) ở cuối liên kết, ngay cả khi không có gói nào trên PyPI. Đây phải là một con số thực tế, không phải là một từ.
  • Bạn cần phải nói git+trước với setuptools rằng nó sao chép repo, thay vì trỏ vào zip / tarball
  • version có thể là một nhánh, một thẻ hoặc một băm cam kết
  • Bạn cần cung cấp --process-dependency-linksnếu cài đặt từ pip

Tôi nhận được một thẻ không thể tìm thấy hoặc thông báo nhánh. Mặc dù thực tế là repo riêng tư mà tôi đang cố gắng sao chép có một thẻ.
trendetter37

1
tìm ra vấn đề là gì. Thẻ đã gắn vsẵn nó trong github. Vì vậy, tôi cần sử dụng v1.1.0thay vì 1.1.0trong tập lệnh setup.py của mình.
trendetter37

4

Tôi đã tìm thấy một cách giải quyết (hacky):

#!/usr/bin/env python

from setuptools import setup
import os

os.system('pip install git+https://github-private.corp.com/user/repo.git@master')

setup( name='original-name'
     , ...
     , install_requires=['repo'] )

Tôi hiểu rằng có những vấn đề đạo đức khi gọi hệ thống trong tập lệnh thiết lập, nhưng tôi không thể nghĩ ra cách khác để thực hiện việc này.


vâng, đây cũng là một giải pháp xấu cho chúng tôi do những điều sau: github.com/pypa/pip/issues/2822
Tommy

Đây là cách duy nhất tôi có thể làm cho nó hoạt động, mặc dù tôi đã đi cùng import pip. Cả câu trả lời của @ vadimg hoặc gợi ý này trong pypa / pip đều không hoạt động.
thị tộc

4
Điều này sẽ cài đặt phụ thuộc ngay cả khi chạy một cái gì đó không liên quan đến cài đặt như python setup.py --version.
WhyNotHugo

1

Qua câu trả lời của Tom Hemmes, tôi thấy đây là điều duy nhất phù hợp với tôi:

    install_requires=[
        '<package> @ https://github.com/<username>/<package>/archive/<branch_name>.zip']

0

Sử dụng URL lưu trữ từ github phù hợp với tôi, đối với các kho lưu trữ công khai. Ví dụ

dependency_links = [
  'https://github.com/username/reponame/archive/master.zip#egg=eggname-version',
]

Làm thế nào để bạn tìm thấy eggname-version?
cglacet

-1

Chỉnh sửa: Điều này dường như chỉ hoạt động với kho lưu trữ github công khai, hãy xem nhận xét.

dependency_links=[
    'https://github.com/my_account/private_repo_1/tarball/master#egg=private_repo_1',
    'https://github.com/my_account/private_repo_2/tarball/master#egg=private_repo_2',
],

Cú pháp trên dường như phù hợp với tôi với setuptools 1.0. Hiện tại, ít nhất cú pháp thêm "# egg = project_name-version" vào các phần phụ thuộc VCS được ghi lại trong liên kết bạn đã cung cấp để phân phối tài liệu .


Tôi vẫn gặp lỗi 404 tương tự. Các repo trong trường hợp của bạn có riêng tư không? Tôi biết cú pháp # egg = nhưng không biết rằng nó ảnh hưởng đến xác thực.
Eric P

Xin lỗi, tất nhiên đó là một dự án repo công khai. Có thể không có bất kỳ cách nào để thực hiện việc này với các công cụ thiết lập hiện tại nếu https // <tên người dùng>: <password> @ ... URL tarball không hoạt động với kho lưu trữ riêng githubs vì câu hỏi này dường như cũng cho biết: đang gặp sự cố khi tải xuống -git-archive-tarballs-from-private-repo
Wor

Bạn cũng có thể thử phiên bản phát triển của setuptools và / hoặc kiểm tra mã. Mã có liên quan dường như là: package_index: fetch_distribution (): 534 package_index.py:_download_url():736
wor

-2

Điều này làm việc cho kịch bản của chúng tôi:

  1. gói trên github trong repo riêng tư
  2. chúng tôi muốn cài đặt nó vào các gói trang (không phải trong ./src với -e)
  3. có thể sử dụng pip install -r request.txt
  4. có thể sử dụng pip install -e reposdir (hoặc từ github), trong đó các phần phụ thuộc chỉ được chỉ định trong request.txt

https://github.com/pypa/pip/issues/3610#issuecomment-356687173

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.