วิธีเขียน setup.py เพื่อรวม git repo เป็นการอ้างอิง


95

ฉันกำลังพยายามเขียนsetup.pyแพคเกจของฉัน แพ็กเกจของฉันจำเป็นต้องระบุการอ้างอิงบน git repo อื่น

นี่คือสิ่งที่ฉันมีจนถึงตอนนี้:

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

คำตอบ:


50

คุณสามารถหาวิธีการที่เหมาะสมที่จะทำที่นี่

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

กุญแจสำคัญคือไม่ให้ลิงก์ไปยังที่เก็บ git แต่เป็นลิงก์ไปยัง tarball Github สร้าง tarball ของสาขาหลักให้คุณหากคุณต่อท้าย/tarball/masterตามที่แสดงด้านบน


17
ดูเหมือนว่าจะเลิกใช้วิธีนี้ต่อgithub.com/pypa/pip/issues/3939
muon

2
วิธีนี้ไม่มีประโยชน์สำหรับที่เก็บส่วนตัวเนื่องจากไม่มีวิธีพิสูจน์ตัวตน
tedivm

3
ฉันจัดการเพื่อให้มันใช้งานได้และได้เพิ่มคำตอบอื่น
tedivm

1
/tarball/masterวิธีการไม่ทำงานสำหรับ gitlab
มาร์ติน Thoma

3
เลิกใช้แล้ว คำตอบที่ถูกต้องคือใช้ Pep508 ตอบโดย @Dick Fox ด้านล่าง
SwimBikeRun

104

หลังจากขุดผ่านปัญหา pip 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.1บ่งชี้แท็กปล่อยสร้างขึ้นบน GitHub และอาจถูกแทนที่ด้วยสาขากระทำหรือชนิดที่แตกต่างกันของแท็ก


หมายเหตุ: ใช้งานได้ดีสำหรับแพ็คเกจท้องถิ่น / ส่วนตัวอย่างไรก็ตามคุณไม่สามารถปล่อยแพ็คเกจเป็น PyPI ที่ใช้ไวยากรณ์นี้ใน setup.py
Brian

7
@ ไบรอันคุณช่วยกรุณาระบุลิงค์ไปยังแถลงการณ์อย่างเป็นทางการ
ช้าง

11
โปรดทราบว่าคุณสามารถทำได้git+https://github.comหากคุณไม่ต้องการใช้ SSH
multithr3at3d

2
แล้วแนวทางที่ถูกต้องในการอัปเกรดคืออะไร? แม้ว่าฉันจะระบุเวอร์ชันแท็ก แต่การอัปเกรดก็ไม่สนใจเวอร์ชันแท็กที่ใหม่กว่า
Piacenti

1
@ ช้างไม่ใช่ทางการสุดยอด แต่อย่างน้อยก็เป็นความคิดเห็นเกี่ยวกับโครงการ pip GitHub จากสมาชิกจริงของ PyPA: github.com/pypa/pip/issues/4187#issuecomment-415667805และคำอธิบายเพิ่มเติม: github.com/pypa/pip / issue / 4187 # exitecomment-415067034
Dominick Pastore

19

คำตอบต่อไปนี้เลิกใช้งานสำหรับ 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 release หรือจากsetup.pyคำอธิบาย?
Peteris

2
จากไฟล์ setup.py หากคุณต้องการใช้สาขาหรือแท็กที่เฉพาะเจาะจงคุณจะจัดรูปแบบสิ่งต่าง ๆ ออกไปเล็กน้อย
tedivm

"น่าเสียดายที่คำตอบอื่นใช้ไม่ได้กับที่เก็บส่วนตัว" นี่ไม่ใช่คำตอบที่แท้จริงอีกต่อไปของ Fox ที่ทำงานบน repo ส่วนตัวโดยไม่จำเป็นdependency_links(ซึ่งเลิกใช้แล้ว )
Keto

ขอบคุณ @Keto! ฉันไม่รู้ว่าเหตุใดการแก้ไขของคุณจึงถูกปฏิเสธ แต่เป็นตัวดัดแปลง แต่ฉันดำเนินการต่อและลบล้างการปฏิเสธนั้นเพื่อเพิ่มการแจ้งเลิกใช้งานให้กับคำตอบ
tedivm

3

คำตอบทั่วไปเพื่อรับข้อมูลจากไฟล์ requeriments.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 runner คุณจะต้องมีสิทธิ์เข้าถึง repo ของคุณ โปรดพิจารณาใช้ 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

ฉันประสบความสำเร็จกับ 3 ตัวเลือกนี้ใน 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"
    ]
)

ทั้ง 3 อย่างฉันทำได้ง่ายๆ: "SomePrivateLib @ git + https: //gitlab.server.com/abc/SomePrivateLib.git" โดยไม่มีเครื่องหมาย #egg ต่อท้าย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.