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.