Git 저장소를 종속성으로 포함하도록 setup.py를 작성하는 방법


100

setup.py내 패키지 를 작성하려고 합니다. 내 패키지는 다른 Git 저장소에 대한 종속성을 지정해야합니다.

이것이 내가 지금까지 가지고있는 것입니다.

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

내가 실행할 때 :

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

나는 얻다

SomePrivateLib> = 0.1.0 (분석에서) 요구 사항을 충족하는 버전을 찾을 수 없습니다 (버전 :) SomePrivateLib> = 0.1.0 (분석에서)에 대해 일치하는 배포를 찾을 수 없습니다.

내가 도대체 ​​뭘 잘못하고있는 겁니까?


setup.py와 pip는 완전히 다른 시스템입니다. 내가 가진 한 가지 문제는 pip에서는 작동하지만 setup.py에서는 작동하지 않는다는 것입니다.
bcattle

답변:


51

여기 에서 올바른 방법을 찾을 수 있습니다 .

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

핵심은 Git 저장소에 대한 링크가 아니라 tarball에 대한 링크를 제공하는 것입니다. /tarball/master위와 같이 추가하면 GitHub에서 마스터 브랜치의 tarball을 생성합니다 .



3
이 방법은 인증 할 방법이 없기 때문에 개인 저장소에도 쓸모가 없습니다.
tedivm

3
나는 그것을 작동시키고 또 다른 대답을 추가했습니다.
tedivm

1
/tarball/master방법은 gitlab 작동하지 않습니다
마틴 토마스에게

5
더 이상 사용되지 않습니다. 정답은 아래에 @dick 폭스 응답 Pep508 사용하는 것입니다
SwimBikeRun

117

관통 파고 후 핍 문제 3939 위 후 코멘트에 @muon로 연결 PEP-508 사양 , 나는 통해 설치하는 내 개인의 repo 의존성을 받고 성공을 setup.py이 규격 패턴을 사용하지 않습니다 install_requires(더 이상 dependency_links) :

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

@v1.1github에서 생성 된 릴리스 태그를 나타내며 브랜치, 커밋 또는 다른 유형의 태그로 대체 할 수 있습니다.


참고 : 이것은 로컬 / 개인 패키지에서는 잘 작동하지만 setup.py에서이 구문을 사용하는 패키지를 PyPI로 릴리스 할 수 없습니다.
Brian

7
@Brian 공식 성명에 대한 링크를 제공해 주시겠습니까?
Elephant

12
당신이 할 수 있습니다 git+https://github.com당신은 SSH를 사용하지 않으려면.
multithr3at3d

2
그렇다면-업그레이드를 수행하는 올바른 접근 방식은 무엇입니까? 태그 버전을 지정하더라도 업그레이드는 새로운 태그 버전을 무시합니다
Piacenti

1
@Elephant 최고 공식은 아니지만 PyPA의 실제 구성원이 작성한 pip GitHub 프로젝트에 대한 의견입니다. github.com/pypa/pip/issues/4187#issuecomment-415667805 및 추가 설명 : github.com/pypa/pip / issues / 4187 # issuecomment-415067034
Dominick Pastore

21

다음 답변은 Pip 19+에서 더 이상 사용되지 않습니다.


불행히도 다른 답변은 개인 저장소에서 작동하지 않으며 이는 가장 일반적인 사용 사례 중 하나입니다. 결국 setup.py다음과 같은 파일로 작업하게되었습니다 .

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는 "dependency_links"를 사용할 필요를 제거하여이 작업을 더욱 쉽게 만듭니다.

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
-0.1접근 방식에서 의미하는 바를 자세히 설명해 주 시겠습니까? git 릴리스 또는 setup.py설명 에서 버전 번호를 가져 오나요 ?
Peteris

2
setup.py 파일에서 특정 브랜치 나 태그를 사용하려면 약간 다른 형식을 지정합니다.
tedivm

"불행히도 다른 답변은 개인 저장소에서 작동하지 않습니다"이것은 더 이상 사실이 아닙니다 Fox의 대답은 필요없이 개인 저장소에서 작동합니다 dependency_links( 사용되지 않음 )
Keto

@Keto 감사합니다! 편집이 거부 된 이유는 모르지만 모드가 거부되었지만 해당 거부를 무시하고 답변에 지원 ​​중단 알림을 추가했습니다.
tedivm

3

보다 일반적인 대답 : requirements.txt 파일 에서 정보를 얻으려면 다음을 수행합니다.

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

실제로 패키지를 재귀 적으로 설치 가능하게 만들고 (YourCurrentPackage에는 SomePrivateLib가 포함됨), 예를 들어 YourCurrentPackage를 다른 패키지에 포함하려는 경우 (예 : OuterPackage → YourCurrentPackage → SomePrivateLib) 둘 다 필요합니다.

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

그리고 버전 번호로 생성 된 태그가 있는지 확인하십시오.

또한 Git 프로젝트가 비공개이고 컨테이너 (예 : Docker 또는 GitLab 실행기) 내에 설치하려는 경우 저장소에 대한 승인 된 액세스가 필요합니다. 액세스 토큰과 함께 Git + HTTPS를 사용하는 것이 좋습니다 (예 : GitLab : 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 에서이 세 가지 옵션으로 성공했습니다 . GitLab 버전 11을 사용하고 있습니다.

옵션 1-토큰이 지정되지 않았습니다. 셸은 사용자 이름 / 암호를 입력하라는 메시지를 표시합니다.

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

옵션 2-사용자 액세스 토큰이 지정되었습니다. GitLab → 계정 오른쪽 상단 → 설정 → 액세스 토큰으로 이동하여 생성 된 토큰입니다. read_repository 권한으로 토큰을 만듭니다.

예:

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

옵션 3-저장소 수준 토큰이 지정되었습니다. 저장소 → 설정 → 저장소 → 토큰 배포로 이동하여 생성 된 토큰입니다. 여기에서 read_repository 권한이있는 토큰을 만듭니다.

예:

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

세 가지 모두에서 끝 부분에 #egg 표시없이 "SomePrivateLib @ git + https : //gitlab.server.com/abc/SomePrivateLib.git"을 간단히 수행 할 수있었습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.