Python kurulum araçları: Özel bir depoyu install_requires altında nasıl listeleyebilirim?


85

setup.pyÖzel GitHub depolarına bağlı bir proje için bir dosya oluşturuyorum . Dosyanın ilgili kısımları şu şekildedir:

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/',
    ],
    ...,
)

Bunun setuptoolsyerine kullanıyorum distutilsçünkü ikincisi bu cevaba göre install_requiresve dependency_linksargümanlarını desteklemiyor .

Yukarıdaki kurulum dosyası, özel depolara 404 hatasıyla erişemiyor - bu, GitHub'ın özel depo için yetkisiz isteklere bir 404 döndürmesi nedeniyle beklenen bir şey. Ancak, nasıl setuptoolskimlik doğrulama yapacağımı çözemiyorum.

İşte denediğim bazı şeyler:

  1. Kullanım git+ssh://yerine https://de dependency_linksben repo yüklerken eğer yaptığınız gibi pip. Bu başarısız olur çünkü setuptools bu protokolü tanımaz ("bilinmeyen url türü: git + ssh"), ancak dağıtım belgeleri bunu yapmalıdır. Aynen git+httpsve git+http.

  2. https://<username>:<password>@github.com/...- yine de 404 alın. (Bu yöntem de komut satırıyla curlveya wgetkomut satırından curl -u <username> <repo_url> -O <output_file_name>çalışmaz - yine de çalışır.)

  3. Kurulum araçlarını (0.9.7) ve virtualenv'yi (1.10) en son sürümlere yükseltme. Ayrıca, bu genel bakış kurulum araçlarına geri birleştirildiğini söylese de, dağıtımı yüklemeyi denedi . Her iki durumda da zar yok.

Şu anda setup.pyözel depoların ayrı olarak indirilmesi gerektiğine dair bir uyarı çıktısı aldım . Bu kesinlikle idealden daha az. Kaçırdığım apaçık bir şey varmış gibi hissediyorum, ama ne olabileceğini düşünemiyorum. :)

Burada yanıtı olmayan yinelenen soru .


Lütfen bir çözümü kabul edin.
wieczorek1990

Yanıtlar:


69

Bunu pip ile kurmak için çalıştırmaya çalışıyordum, ancak yukarıdakiler benim için çalışmıyordu. [1] 'den PEP508standardın kullanılması gerektiğini anladım, [2]' den gerçekten işe yarayan bir örnek aldım (en azından benim durumum için).

Lütfen aklınızda bulundurun; bu pip 20.0.2açıkPython 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>',
    ],
)

Paketimi bu şekilde -ebelirledikten sonra kurulum iyi çalışıyor (ayrıca ayarlarla ve belirtmeye gerek kalmadan --process-dependency-links).

Referanslar [1] https://github.com/pypa/pip/issues/4187 [2] https://github.com/pypa/pip/issues/5566


#egg=...Bölüm şimdi gereksiz görünüyor.
Huazuo Gao

1
Teşekkürler! Kesinlikle haklısınız, hem #eggve branch(edit bakınız) isteğe bağlıdır ve aynı zamanda çalışır git+https.
Tom Hemmes

1
Eğer kullanırsanız ssh://ve içine çalıştırmak Could not resolve hostnamedeğişikliği :için /klon url. Gitlab ile bu hatayı aldım.
delijati

11
Bu artık işe yaramıyor gibi görünüyor, çünkü setuptools PyPi'de bağımlılık adı olan bir paket arıyor: Reading https://pypi.org/simple/some-fake-name/ve sonra Couldn't find index page for 'some_fake_name' (maybe misspelled?). Sonunda, görüntülenen son hataerror: Could not find suitable distribution for Requirement.parse('some_fake_name@ git+ssh://git@github.com/cglacet/quadtree.git')
cglacet

1
<dependency_name> 'nin <repo_name> ile aynı olmadığını ve herkese açık bir repo ise' ssh: // git @ 'yerine' https: // 'koyabileceğinizi vurgulayın
Phil P

41

İşte benim için çalıştı:

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

Yumurta adında sürüm numarasına sahip olmanız gerektiğini unutmayın, aksi takdirde paketi bulamayacağını söyleyecektir.


3
Merhaba vadimg - Hangi setuptools / distribute sürümünü kullanıyorsunuz? 0.7.3 (en son sürüm) dağıtımını kullanarak "Bilinmeyen url türü: git + ssh" alıyorum.
Eric P

2
Bu 3 yıl sonra benim için işe yaramadı ... Anladım: Gereksinimi karşılayan bir sürüm
bulunamadı

7
28 Ekim 2016 itibariyle, bu yaklaşım bozuk görünüyor
Maks

1
Modern pipler için bir seçenek eklemeniz gerekir, örneğinpip install --process-dependency-links ...
Ash Berlin-Taylor

2
--process-dpendency-linkskullanımdan kaldırıldı, PEP508 url spesifikasyonunu kullanarak cevabıma bakın
Tom Hemmes

10

Bununla ilgili iyi bir belge bulamadım, ancak çözüme esas olarak deneme yanılma yoluyla rastladım. Ayrıca, pip & setuptools'dan kurulumun bazı ince farklılıkları vardır; ancak bu yol her ikisi için de çalışmalıdır.

GitHub (şu anda Ağustos 2016 itibariyle) özel depoların zip / tarball'unu almanın kolay bir yolunu sunmuyor. Bu nedenle, kurulum araçlarına git deposunu işaret ettiğinizi söylemek için kurulum araçlarını işaret etmeniz gerekir:

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)
        ] 

Burada birkaç not:

  • Özel depolar için GitHub ile kimlik doğrulamanız gerekir; Bulduğum en basit yol, bir oauth jetonu oluşturmak, bunu ortamınıza bırakmak ve ardından bunu URL'ye dahil etmek
  • Sen eklemeniz gerekir bazı sürüm numarası (burada 0PyPI üzerinde hiçbir paket olmasa bile, bağlantının sonuna). Bu gerçek bir sayı olmalı, bir kelime değil.
  • git+Setuptools'a bir zip / tarball'a işaret etmek yerine repo'yu klonlamak gerektiğini söylemek için önsöz yapmanız gerekir.
  • version dal, etiket veya kaydetme karması olabilir
  • --process-dependency-linksPip'den kurulum yapıyorsanız tedarik etmeniz

Bulunamıyor etiketi veya dal mesajı alıyorum. Klonlamaya çalıştığım özel deponun bir etiketi olmasına rağmen.
trendsetter37

1
sorunun ne olduğunu anladı. Etiketin vbaşına github'da bir etiket vardı . Bu yüzden setup.py betiğimde kullanmak v1.1.0yerine kullanmam gerekiyordu 1.1.0.
trendsetter37

4

Bir (hacky) geçici çözüm buldum:

#!/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'] )

Bir kurulum komut dosyasında sistem çağrısı yapmanın etik sorunları olduğunu anlıyorum, ancak bunu yapmanın başka bir yolunu düşünemiyorum.


evet, bu aynı zamanda bizim için çirkin bir çözümdü
Tommy

Ben de gitmeme rağmen onu çalıştırabilmemin tek yolu bu import pip. Ne @ vadimg'in cevabı ne de pypa / pip'teki bu öneri işe yaramadı.
gens

5
Bu, kurulumla ilgili olmayan bir şey çalıştırsa bile bir bağımlılık kuracaktır python setup.py --version.
WhyNotHugo

1

Tom Hemmes'in cevabıyla bunun benim için işe yarayan tek şey olduğunu buldum:

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

0

Github'daki arşiv URL'sini kullanmak benim için, genel havuzlar için çalışıyor. Örneğin

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

Nasıl buluyorsunuz eggname-version?
cglacet

-1

Düzenleme: Bu yalnızca genel github depolarıyla çalışıyor gibi görünüyor, yorumlara bakın.

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',
],

Yukarıdaki sözdizimi, setuptools 1.0 ile benim için çalışıyor gibi görünüyor. Şu anda VCS bağımlılıklarına "# yumurta = proje_adı-sürümü" eklemenin sözdizimi, belgeleri dağıtmak için verdiğiniz bağlantıda belgelenmiştir .


Hala aynı 404 hatasını alıyorum. Sizin durumunuzdaki depolar özel mi? # Egg = sözdiziminin farkındayım ancak kimlik doğrulamasını etkilediğini bilmiyorum.
Eric P

Üzgünüm, elbette bir kamu repo projesiydi. Https // <username>: <password> @ ... tarball URL'leri githubs özel depolarıyla çalışmıyorsa, muhtemelen mevcut kurulum araçlarıyla bunu yapmanın herhangi bir yolu yoktur, çünkü bu soru aynı zamanda şunu da gösterir: having-
wor

Kurulum araçlarının geliştirme sürümünü de deneyebilir ve / veya kodu kontrol edebilirsiniz. İlgili kod şu şekilde görünüyor: package_index: fetch_distribution (): 534 package_index.py:_download_url():736
wor

-2

Bu senaryomuz için çalışıyor:

  1. paket özel bir depoda github'da
  2. bunu site paketlerine kurmak istiyoruz (-e ile ./src'ye değil)
  3. pip install -r gereksinimleri.txt kullanabilmek
  4. pip install -e reposdir'i (veya github'dan) kullanabilme, burada bağımlılıklar yalnızca requirements.txt dosyasında belirtilmiştir

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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.