Git 저장소를 종속성으로 포함하기 위해 setup.py 을 작성하는 방법.
나는 글을 쓰려고 노력하고 있습니다.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(분석에서)에 대해 일치하는 배포를 찾을 수 없습니다.
내가 뭘 잘못하고 있는 거지?
참고: 이 답변은 이제 구식입니다.최신 지침은 다음 답변을 참조하십시오. https://stackoverflow.com/a/54701434/212774
위의 댓글에서 @muon에 의해 링크된 pip 이슈 3939와 PEP-508 사양을 파헤친 후, 저는 성공적으로 제 개인 리포넌시를 통해 설치할 수 있다는 것을 발견했습니다.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에 생성된 릴리스 태그를 나타내며 분기, 커밋 또는 다른 유형의 태그로 대체할 수 있습니다.
이 답변은 수년간 Python이 발전함에 따라 업데이트되었습니다.
가장 최근의 답변을 보려면 맨 아래로 스크롤하거나, 이 답변이 어떻게 발전했는지 확인하려면 끝까지 읽으십시오.
안타깝게도 허용된 답변은 가장 일반적인 사용 사례 중 하나인 개인 저장소에서 작동하지 않습니다.
2019 - dependency_discovery(pip v19+ 이후 사용되지 않음)
저는 결국 그것을 작동시켰습니다.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_org/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_org/ExampleRepo.git#egg=ExampleRepo-0.1'
]
)
그러나 최신 파이프를 사용하면 EGG 형식 핸들러에 문제가 발생합니다.이는 에그가 무시되는 동안 pip가 현재 직접 URL 매칭을 수행하고 있으며, 하나는 에그 프래그먼트가 있는 URL이고 다른 하나는 그렇지 않은 URL은 동일한 패키지를 가리켜도 완전히 다른 버전으로 간주하기 때문입니다.따라서 계란 조각은 모두 제거하는 것이 가장 좋습니다.
2021년 6월 - 설정.파이의
Github에서 setup.py 에 퍼블릭 및 프라이빗 저장소와 함께 작동하는 종속성을 추가하는 가장 좋은 방법은 다음과 같습니다(현재 2021년 6월).
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_org/ExampleRepo.git'
]
)
2022년 2월 - setup.cfg
분명히 setup.py 은 사용되지 않고 있으며(내 추측으로는 당분간 존재할 것으로 예상되지만) setup.cfg는 새로운 것입니다.
[metadata]
name = MyProject
version = 0.1.1
[options]
packages = :find
install_requires =
ExampleRepo @ git+ssh://git@github.com/example_org/ExampleRepo.git
2022년 6월 16일 - pyproject.toml.
setup.cfg는 이미 "pre" 사용되지 않습니다.이제 setuptools는 pyproject.toml 파일을 실험적으로 지원합니다.
이것은 미래의 일이지만, 아직 실험적인 일이기 때문에 현재로서는 실제 프로젝트에 사용해서는 안 됩니다.그럼에도 불구하고.setup.cfg가 나오는 중입니다. 선언적 형식으로 사용해야 합니다. 그렇지 않으면 setup.py 가 여전히 유효합니다.이 답변은 설치 도구가 새 표준 지원을 안정화하면 업데이트됩니다.
2023년 1월 4일 - pyproject.toml.
제다음서에모종정수있다습니의할을속이성든에서 모든 할 수 .pyproject.tomlsetup.cfg와 같은 다른 옵션은 여전히 작동합니다.
[build-system]
requires = ["setuptools", "setuptools-scm"]
build-backend = "setuptools.build_meta"
[project]
dependencies = [
'ExampleRepo @ git+ssh://git@github.com/example_org/ExampleRepo.git',
]
[project.optional-dependencies]
dev = ['ExtraExample @ git+ssh://git@github.com/example_org/ExtraExample.git']
참고: 이 답변은 이제 구식입니다.최신 지침은 다음 답변을 참조하십시오. https://stackoverflow.com/a/54701434/212774
여기서 올바른 방법을 찾을 수 있습니다.
dependency_links=['http://github.com/user/repo/tarball/master#egg=package-1.0']
핵심은 Git 저장소에 대한 링크를 제공하는 것이 아니라 tarball에 대한 링크를 제공하는 것입니다.은 GitHub을 하면 마스터 브랜치의 합니다./tarball/master상술한 바와 같이
보다 일반적인 답변:요구 사항으로부터 정보를 얻습니다.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+'):
line = line.lstrip('-e ') # in case that is using "-e"
if EGG_MARK in line:
package_name = line[line.find(EGG_MARK) + len(EGG_MARK):]
repository = line[:line.find(EGG_MARK)]
required.append('%s @ %s' % (package_name, repository))
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,
)
실제로 패키지를 재귀적으로 설치할 수 있도록 하려면(예: 현재 패키지에 SomePrivateLib 포함), 예를 들어 현재 패키지를 다른 패키지에 포함하려는 경우(예: 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 runner와 같이 컨테이너 내에 설치하려는 경우 저장소에 대한 인증된 액세스 권한이 필요합니다.액세스 토큰과 함께 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"
]
)
업데이트됨:
요구 사항에 대해 이 종속성을 유지하려면 종속성 행 끝에 #egg=SomePrivateLib를 넣어야 합니다.txt 파일.그렇지 않은 경우 pip install -r 요구 사항.txt는 당신에게 효과가 없을 것이고 당신은 다음과 같은 것을 얻을 것입니다.
오류: 'git+https://gitlab-ci-token:gitlabtokenvalue@gitlab.server.com /abc/SomePrivateLib.git@0.1.0'에 대한 요구 사항 이름을 검색할 수 없습니다. #message=your_package_name으로 지정하십시오.
요구 사항을 사용하는 경우.txt, 이 부분은 python_home_home/src 내에 생성될 종속성 폴더의 이름과 site-link/의 egg-link의 이름을 담당합니다.
요구 사항에 환경 변수를 사용할 수 있습니다.txt: 종속성의 토큰 값을 안전하게 저장소에 저장합니다.
요구 사항의 예제 행입니다.이 경우의 txt 파일:
....
-e git+https://gitlab-ci-token:${EXPORTED_VAR_WITH_TOKEN}@gitlab.server.com/abc/SomePrivateLib.git@0.1.0#egg=SomePrivateLib
....
저는 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"
]
)
세 가지 모두에서 저는 간단하게 "SomePrivateLib @git+https://gitlab.server.com/abc/SomePrivateLib.git "을 수행할 수 있었습니다. 마지막에 #dll 표시가 없습니다.
이 솔루션은 python setup.py install을 실행할 때 사용할 수 있습니다.
setuptools.setup(
...,
install_requires=[
'numpy',
'pandas',
'my_private_pkg'
],
dependency_links=["git+https://github.com/[username]/[my_private_pkg].git@main#egg=my_private_pkg"],
...
)
언급URL : https://stackoverflow.com/questions/32688688/how-to-write-setup-py-to-include-a-git-repository-as-a-dependency
'programing' 카테고리의 다른 글
| 비트 버킷의 Git 저장소에 푸시할 수 없습니다. (0) | 2023.06.26 |
|---|---|
| 기존 Oracle 데이터베이스에서 데이터베이스 다이어그램/ER 다이어그램을 생성하는 도구? (0) | 2023.06.26 |
| 메이븐에서 여러 스프링 부트 애플리케이션에 대한 엔드 투 엔드 통합 테스트 (0) | 2023.06.26 |
| TypeScript가 가져온 상수가 정의되지 않았습니다. (0) | 2023.06.26 |
| 두 Excel 파일의 모든 셀을 비교하는 VBA 매크로 (0) | 2023.06.26 |