Bir bağımlılık olarak bir git deposu eklemek için setup.py nasıl yazılır


95

setup.pyPaketim için yazmaya çalışıyorum . Paketimin başka bir git deposuna bağımlılık belirtmesi gerekiyor.

Şimdiye kadar sahip olduğum şey bu:

from setuptools import setup, find_packages

setup(
    name='abc',
    packages=find_packages(),
    url='https://github.abc.com/abc/myabc',
    description='This is a description for abc',
    long_description=open('README.md').read(),
    install_requires=[
        "requests==2.7.0",
        "SomePrivateLib>=0.1.0",
        ],
    dependency_links = [
     "git+git://github.abc.com/abc/SomePrivateLib.git#egg=SomePrivateLib",
    ],
    include_package_data=True,
)

Koştuğumda:

pip install -e https://github.abc.com/abc/myabc.git#egg=analyse

alırım

SomePrivateLib> = 0.1.0 (analizden) gereksinimini karşılayan bir sürüm bulunamadı (sürümlerden:) SomePrivateLib> = 0.1.0 (analizden) için eşleşen dağıtım bulunamadı

Neyi yanlış yapıyorum ?


Setup.py ve pip'in tamamen farklı sistemler olduğunu unutmayın. Sahip olduğum bir sorun, bunu pip için çalıştırabilmemdi, ancak setup.py için değil.
bcattle

Yanıtlar:


50

Bunu yapmanın doğru yolunu burada bulabilirsiniz .

dependency_links=['http://github.com/user/repo/tarball/master#egg=package-1.0']

Anahtar, git deposuna bir bağlantı vermek değil, bir tarball'a bağlantı vermek. Github, /tarball/masteryukarıda gösterildiği gibi eklerseniz sizin için ana daldan bir tarball oluşturur .



2
Kimlik doğrulamanın bir yolu olmadığından, bu yöntem özel depolar için de işe yaramaz.
tedivm

3
Çalışmasını başardım ve başka bir cevap ekledim.
tedivm

1
/tarball/masterYöntem gitlab için çalışmıyor
Martin Thoma

3
Kullanımdan kaldırıldı. Doğru cevap Pep508'i kullanmaktır, aşağıdaki @Dick Fox tarafından cevaplanmıştır
SwimBikeRun

104

İle kazma sonra pip sorunu 3939 yukarıda ve daha sonra yorumlarda @muon bağlanmış PEP-508 şartname , ben üzerinden yüklemek için benim özel repo bağımlılığını alma başarısını bulundu setup.pybu şartname kalıbı kullanarak install_requires(artık dependency_links):

install_requires = [
  'some-pkg @ git+ssh://git@github.com/someorgname/pkg-repo-name@v1.1#egg=some-pkg',
]

@v1.1Github üzerinde oluşturulan serbest bırakma etiketini belirtir ve bir dal, taahhüt veya etiketin farklı tip ile değiştirilmesi mümkündür.


Not: Bu, yerel / özel paketler için iyi çalışıyor, ancak bu sözdizimini kendi setup.py
Brian

7
@Brian Lütfen resmi açıklamaya bir bağlantı verebilir misiniz?
Fil

11
Yapabileceğiniz Not git+https://github.comEğer SSH kullanmak istemiyorsanız.
multithr3at3d

2
Peki, yükseltme yapmak için doğru yaklaşım nedir? Bir etiket sürümü belirtmeme rağmen, yükseltme yalnızca daha yeni etiket sürümlerini yok sayıyor
Piacenti

1
@Elephant Süper resmi değil, ancak bunlar en azından PyPA'nın gerçek üyelerinden pip GitHub projesi hakkında yorumlar: github.com/pypa/pip/issues/4187#issuecomment-415667805 ve daha fazla açıklama: github.com/pypa/pip / sorunlar / 4187 # issuecomment-415067034
Dominick Pastore

19

Aşağıdaki yanıt Pip 19+ için kullanımdan kaldırılmıştır


Maalesef diğer cevap, bunun için en yaygın kullanım durumlarından biri olan özel depolarla çalışmıyor. Sonunda setup.pyşuna benzeyen bir dosyayla çalışmasını sağladım:

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository - needs entry in `dependency_links`
        'ExampleRepo'
    ],

    dependency_links=[
        # Make sure to include the `#egg` portion so the `install_requires` recognizes the package
        'git+ssh://git@github.com/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

Pip'in daha yeni sürümleri, "bağımlılık_bağlantıları" kullanma ihtiyacını ortadan kaldırarak bunu daha da kolaylaştırır -

from setuptools import setup, find_packages

setup(
    name = 'MyProject',
    version = '0.1.0',
    url = '',
    description = '',
    packages = find_packages(),
    install_requires = [
        # Github Private Repository
        'ExampleRepo @ git+ssh://git@github.com/example_organization/ExampleRepo.git#egg=ExampleRepo-0.1'
    ]
)

1
Lütfen -0.1yaklaşımınızda neyin temsil edildiğini açıklar mısınız? Sürüm numarasını bir git sürümünden setup.pymi yoksa açıklamadan mı alıyorsunuz ?
Peteris

2
Setup.py dosyasından - belirli bir dalı veya etiketi kullanmak istiyorsanız, her şeyi biraz farklı biçimlendirirsiniz.
tedivm

"Maalesef diğer cevap özel havuzlarda işe yaramıyor" Bu artık doğru değil Fox'un cevabı özel depo üzerinde ihtiyaç duymadan çalışıyor dependency_links(ki bu artık kullanılmıyor )
Keto

Teşekkürler @ Keto! Düzenlemenizin neden reddedildiğini bilmiyorum ama modlar, ama ben devam ettim ve cevaba kullanımdan kaldırma uyarısını eklemek için bu reddi geçersiz kıldım.
tedivm

3

Daha genel bir cevap, Requeriments.txt dosyasından bilgi almak için yapıyorum:

from setuptools import setup, find_packages
from os import path

loc = path.abspath(path.dirname(__file__))

with open(loc + '/requirements.txt') as f:
    requirements = f.read().splitlines()

required = []
dependency_links = []
# do not add to required lines pointing to git repositories
EGG_MARK = '#egg='
for line in requirements:
    if line.startswith('-e git:') or line.startswith('-e git+') or \
            line.startswith('git:') or line.startswith('git+'):
        if EGG_MARK in line:
            package_name = line[line.find(EGG_MARK) + len(EGG_MARK):]
            required.append(package_name)
            dependency_links.append(line)
        else:
            print('Dependency to a git repository should have the format:')
            print('git+ssh://git@github.com/xxxxx/xxxxxx#egg=package_name')
    else:
        required.append(line)

setup(
    name='myproject',  # Required
    version='0.0.1',  # Required
    description='Description here....',  # Required
    packages=find_packages(),  # Required
    install_requires=required,
    dependency_links=dependency_links,
) 

1

Aslında, paketlerinizi yinelemeli olarak kurulabilir hale getirmek istiyorsanız (YourCurrentPackage, SomePrivateLib'inizi içerir), örneğin YourCurrentPackage'ı başka bir pakete dahil etmek istediğinizde (OuterPackage -> YourCurrentPackage -> SomePrivateLib gibi) ikisine de ihtiyacınız olacak:

install_requires=[
    ...,
    "SomePrivateLib @ git+ssh://github.abc.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
],
dependency_links = [
    "git+ssh://github.abc.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
]

Ve sürüm numaranızla oluşturulmuş bir etiketiniz olduğundan emin olun.

Ayrıca git projeniz özelse ve Docker veya GitLab çalıştırıcısı gibi konteynerin içine kurmaktan hoşlanıyorsanız, deponuza yetkili erişime ihtiyacınız olacaktır. Lütfen erişim belirteçleriyle git + https kullanmayı düşünün (GitLab'da olduğu gibi: https://docs.gitlab.com/ee/user/profile/personal_access_tokens.html ):

import os
from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    ....

    install_requires=[
            ...,
            f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ],
    dependency_links = [
            f"git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

0

Gitlab'de bu 3 seçenekle başarılı oldum. Gitlab'ın 11 sürümünü kullanıyorum.

seçenek 1 - belirteç belirtilmedi. shell kullanıcı adı / parola isteyecektir.

from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        "SomePrivateLib @ git+https://gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

seçenek 2 - kullanıcı erişim belirteci belirtildi. gitlab> sağ üst hesap> ayarlar> erişim belirteçlerine gidilerek oluşturulan jeton. read_repository haklarıyla belirteç oluşturun.

misal:

import os
from setuptools import setup

TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        f"SomePrivateLib @ git+https://gitlab-ci-token:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

seçenek 3 - depo düzeyinde belirteç belirtildi. Depo> ayarlar> depo> belirteçleri dağıt seçeneğine gidilerek oluşturulan belirteç. buradan tekrar okuma haklarına sahip bir belirteç oluşturun.

misal:

import os
from setuptools import setup

TOKEN_USER = os.getenv('EXPORTED_TOKEN_USER')
TOKEN_VALUE = os.getenv('EXPORTED_VAR_WITH_TOKEN')

setup(
    install_requires=[
        f"SomePrivateLib @ git+https://{TOKEN_USER}:{TOKEN_VALUE}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib"
    ]
)

Her üçünde de sonunda #egg işareti olmadan "SomePrivateLib @ git + https: //gitlab.server.com/abc/SomePrivateLib.git" yapabildim.

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.