2013-08-02 35 views
36

Tôi đang tạo tệp setup.py cho một dự án phụ thuộc vào kho lưu trữ GitHub riêng tư. Các bộ phận có liên quan của các tập tin giống như thế này:Trình thiết lập Python: Làm thế nào tôi có thể liệt kê một kho lưu trữ riêng dưới install_requires?

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 setuptools thay vì distutils vì sau này không hỗ trợ install_requiresdependency_links luận mỗi this câu trả lời.

Tệp thiết lập ở trên không truy cập được các bản repos riêng với lỗi 404 - đượ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 để xác thực setuptools.

Dưới đây là một số những điều tôi đã cố gắng:

  1. Sử dụng git+ssh:// thay vì https:// trong dependency_links như tôi sẽ 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ù số distribute documentation cho biết. Ditto git+httpsgit+http.

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

  3. setuptools Nâng cấp (0.9.7) và virtualenv (1.10) đến phiên bản mới nhất. Cũng cố gắng cài đặt phân phối mặc dù this overview nói rằng nó đã được sáp nhập 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 chỉ có setup.py in ra cảnh báo rằng bản repos riêng 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 bỏ lỡ, nhưng không thể nghĩ nó có thể là gì. :)

Câu hỏi trùng lặp-ish không có câu trả lời here.

Trả lời

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, 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ư hoạt động với tôi với các công cụ thiết lập 1.0. Hiện tại, ít nhất cú pháp thêm "# egg = project_name-version" vào các phụ thuộc VCS được ghi lại trong liên kết mà bạn đã cung cấp cho distribute documentation.

+0

tôi vẫn nhận được cùng một lỗi 404. Repos 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. –

+0

Xin lỗi, tất nhiên là một dự án repo công cộng. Có thể không có 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 // : @ ... URL tarball không hoạt động với kho lưu trữ riêng tư github vì câu hỏi này dường như cũng cho biết: [have-trouble-download-git- archive-tarballs-from-private-repo] (http://stackoverflow.com/questions/10046027/having-trouble-downloading-git-archive-tarballs-from-private-repo) – wor

+0

Bạn cũng có thể thử phiên bản phát triển của các công cụ thiết lập và/hoặc kiểm tra mã. Mã có liên quan có vẻ là: [package_index: fetch_distribution(): 534] (https://bitbucket.org/pypa/setuptools/src/9f475ec7aedd04ccf89483d8575808d30e31ab51/setuptools/package_index.py?tại = mặc định # cl-534) [package_index.py:_download_url():736](https://bitbucket.org/pypa/setuptools/src/9f475ec7aedd04ccf89483d8575808d30e31ab51/setuptools/package_index.py?at=default#cl-736) – wor

30

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

install_requires=[ 
     'private_package_name==1.1', 
    ], 
    dependency_links=[ 
     'git+ssh://[email protected]/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ẽ nói nó không thể tìm thấy gói.

+3

Hi vadimg - Bạn đang sử dụng phiên bản thiết lập/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). –

+1

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

+5

Tính đến ngày 28 tháng 10 năm 2016, phương pháp này dường như bị hỏng – Max

3

Sử dụng URL lưu trữ từ github hoạt động đối 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', 
] 
1

Tôi tìm thấy một (hacky) workaround:

#!/usr/bin/env python 

from setuptools import setup 
import os 

os.system('pip install git+https://github-private.corp.com/user/[email protected]') 

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

Tôi hiểu rằng có những vấn đề đạo đức với việc có một cuộc gọi hệ thống trong một kịch bản cài đặt, nhưng tôi không thể nghĩ ra một cách khác để làm điều này.

+0

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

+0

Đây là cách duy nhất tôi có thể làm cho nó hoạt động, mặc dù tôi đã đi với 'pip nhập khẩu '. Không câu trả lời của @ vadimg hoặc [đề xuất này trong pypa/pip] (https://github.com/pypa/pip/issues/2124) đã hoạt động. – gens

+0

Điều này sẽ cài đặt mộ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

3

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

GitHub không (hiện tại, tính đến tháng 8 năm 2016) cung cấp một cách dễ dàng để nhận mã zip/tarball của các bản repos riêng tư. Vì vậy, bạn cần phải chỉ setuptools nói setuptools rằng bạn đang trỏ đến một repo git:

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 hợp đồng mua tin, bạn cần phải xác thực với GitHub; cách đơn giản nhất 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 rồi đưa mã đó vào URL
  • Bạn cần bao gồm một số số phiên bản (ở đây là 0) ở cuối liên kết, thậm chí nếu không có gói 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 mở đầu với git+ nói setuptools nó để clone repo, chứ không phải chỉ vào một zip/tarball
  • version có thể là một chi nhánh, một thẻ, hoặc một cam kết băm
  • Bạn không cần cung cấp --process-dependency-links nếu cài đặt từ pip
+0

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

+0

Lệnh nào bạn đang sử dụng @ trendsetter37 – Maximilian

+1

đã tìm ra vấn đề là gì. Thẻ có 'v' được thêm vào nó trong github. Vì vậy, tôi cần sử dụng 'v1.1.0' thay vì' 1.1.0' trong tập lệnh setup.py của tôi. – trendsetter37

0

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

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

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