วิธีการระบุใน requirements.txt แหล่ง github โดยตรง


448

ฉันติดตั้งไลบรารีโดยใช้คำสั่ง

pip install git+git://github.com/mozilla/elasticutils.git

ซึ่งติดตั้งโดยตรงจากแหล่งเก็บ Github requirements.txtนี้ทำงานได้ดีและผมต้องการที่จะมีการพึ่งพาในการที่ของฉัน ฉันดูตั๋วประเภทอื่นเช่นนี้แต่นั่นก็ไม่ได้แก้ปัญหาของฉัน ถ้าฉันใส่อะไรเช่น

-f git+git://github.com/mozilla/elasticutils.git
elasticutils==0.7.dev

ในrequirements.txtไฟล์pip install -r requirements.txtผลลัพธ์ในเอาต์พุตต่อไปนี้:

Downloading/unpacking elasticutils==0.7.dev (from -r requirements.txt (line 20))
  Could not find a version that satisfies the requirement elasticutils==0.7.dev (from -r requirements.txt (line 20)) (from versions: )
No distributions matching the version for elasticutils==0.7.dev (from -r requirements.txt (line 20))

เอกสารของแฟ้มความต้องการไม่ได้พูดถึงการเชื่อมโยงโดยใช้git+gitระบุโปรโตคอลดังนั้นบางทีนี้เป็นเพียงการได้รับการสนับสนุน

ใครบ้างมีวิธีแก้ไขปัญหาของฉันหรือไม่

คำตอบ:


327

ไวยากรณ์ของแพคเกจ“ แก้ไขได้”สามารถใช้ในrequirements.txtการนำเข้าแพ็คเกจจากVCSหลากหลาย(git, hg, bzr, svn) :

-e git://github.com/mozilla/elasticutils.git#egg=elasticutils

นอกจากนี้ยังเป็นไปได้ที่จะชี้ไปที่การกระทำเฉพาะ:

-e git://github.com/mozilla/elasticutils.git@000b14389171a9f0d7d713466b32bc649b0bed8e#egg=elasticutils

3
ฉันไม่ได้จัดการเช็คเอาต์ในประเทศให้เป็นรุ่นที่แก้ไขได้ (เนื่องจากปัญหาไวยากรณ์อาจ) และสิ้นสุดลงโดยใช้git+gitตัวแปร (ซึ่งใช้งานได้) ในrequirements.txtงานรุ่นของคุณเพื่อให้ขอบคุณมาก :)
Alfe

1
docsการเชื่อมโยงไม่ได้ทำงานสำหรับฉัน ผมเคยใช้อย่างใดอย่างหนึ่งที่มีอายุมากกว่า
osa

42
สิ่งที่ฉันไม่เข้าใจก็คือไวยากรณ์ที่แสดงนั้นเป็นสิ่งที่ตรงตามข้อกำหนดเช่นไม่มีชื่อแพ็กเกจก่อนหน้า -e
ปราชญ์

5
การเพิ่ม "-e" ไม่จำเป็นขึ้นอยู่กับว่าคุณต้องการให้แพ็กเกจอยู่ในโหมดแก้ไขได้หรือไม่ดูคำตอบโดย @qff
สกาย

17
ไม่ควรที่จะเป็น-e git+git://แทน-e git://? ผมได้"อย่างใดอย่างหนึ่งที่ควรจะเป็นเส้นทางไปยังโครงการท้องถิ่นหรือจุดเริ่มต้น URL VCS กับ SVN + คอมไพล์ + hg + หรือ + bzr เป็น"ข้อผิดพลาด
บรูซเวย์น

424

โดยปกติrequirements.txtไฟล์ของคุณจะมีลักษณะดังนี้:

package-one==1.9.4
package-two==3.7.1
package-three==1.0.1
...

ในการระบุ repo Github คุณไม่จำเป็นต้องมีการpackage-name==ประชุม

ตัวอย่างด้านล่างอัปเดตpackage-twoโดยใช้ repo GitHub ข้อความระหว่าง@และ#หมายถึงเฉพาะของแพคเกจ

ระบุแฮชคอมมิต ( 41b95ecในบริบทของการอัพเดตrequirements.txt):

package-one==1.9.4
git+git://github.com/path/to/package-two@41b95ec#egg=package-two
package-three==1.0.1

ระบุชื่อสาขา ( master):

git+git://github.com/path/to/package-two@master#egg=package-two

ระบุแท็ก ( 0.1):

git+git://github.com/path/to/package-two@0.1#egg=package-two

ระบุรุ่น ( 3.7.1):

git+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-two

โปรดทราบว่า#egg=package-twoนี่ไม่ใช่ความคิดเห็นที่นี่ก็คือการระบุชื่อแพคเกจอย่างชัดเจน

โพสต์บล็อกนี้มีการอภิปรายเพิ่มเติมในหัวข้อ


54
จากคำตอบอื่น ๆ ทั้งหมดฉันไม่อยากจะเชื่อเลยว่าไม่มีพวกเขาเพียงแค่แสดงไฟล์ข้อกำหนดที่มีการผสมผสานของคำขอ "ปกติ" กับคอมไพล์ที่ถูกโยนทิ้งเพื่อเปรียบเทียบ ฉันถูกโยนออกไปโดยสิ่งที่ดูเหมือนว่า-eตัวเลือกบรรทัดคำสั่ง ( ) ขอบคุณที่แสดงให้เห็นถึงการผสมผสานของทั้งสองดังนั้นฉันสามารถใส่มันในบริบท!
Hendy

การชี้ไปที่รีลีส3.7.1ด้วยgit+git://github.com/path/to/package-two@releases/tag/v3.7.1#egg=package-twoไม่ได้ผลสำหรับฉัน git+git://github.com/path/to/package-two@3.7.1#egg=package-twoสิ่งที่ทำงานสำหรับฉันคือ
Jean Paul

คำตอบนี้มีประโยชน์มาก สิ่งหนึ่งที่แม้ว่า git+git://...สัญกรณ์เหล่านั้นทำให้เกิดข้อผิดพลาด ssh สัมพัทธ์ในกล่อง Linux ของฉัน ดังนั้นฉันเลยเปลี่ยนมาใช้git+https://...สัญกรณ์แล้วก็ทำงานได้อย่างสมบูรณ์
RayLuo

174

requirements.txtอนุญาตวิธีต่อไปนี้ในการระบุการขึ้นต่อกันของแพ็กเกจในที่เก็บ git ณ pip 7.0: 1

[-e] git+git://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+https://git.myproject.org/SomeProject#egg=SomeProject
[-e] git+ssh://git.myproject.org/SomeProject#egg=SomeProject
-e git+git@git.myproject.org:SomeProject#egg=SomeProject

สำหรับ Github ซึ่งหมายความว่าคุณสามารถทำได้ (สังเกตสิ่งที่ตัดออก-e):

git+git://github.com/mozilla/elasticutils.git#egg=elasticutils

ทำไมคำตอบพิเศษ?
ฉันรู้สึกสับสนกับ-eธงในคำตอบอื่น ๆ ดังนั้นนี่คือคำอธิบายของฉัน:

-eหรือ--editableธงหมายความว่าแพคเกจติดตั้งใน<venv path>/src/SomeProjectและดังนั้นจึงไม่ได้อยู่ในฝังลึก<venv path>/lib/pythonX.X/site-packages/SomeProjectมันมิฉะนั้นจะถูกวางไว้ใน. 2

เอกสาร


9
แต่โปรดทราบว่าหากคุณไม่ทำสิ่ง-eต่อไปของคุณpip freezeอาจไม่ให้ผลลัพธ์ที่ถูกต้องสำหรับแพ็คเกจนี้
Maccesch

82

ก่อนอื่นให้ติดตั้งด้วยgit+gitหรือgit+httpsในแบบที่คุณรู้ ตัวอย่างการติดตั้งkronokสาขาของbrabeionโครงการ:

pip install -e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion

ประการที่สองการใช้งานที่จะได้รับสิ่งที่ถูกต้องในของคุณpip freeze > requirements.txt requirements.txtในกรณีนี้คุณจะได้รับ

-e git+https://github.com/kronok/brabeion.git@12efe6aa06b85ae5ff725d3033e38f624e0a616f#egg=brabeion-master

ประการที่สามทดสอบผล:

pip uninstall brabeion
pip install -r requirements.txt

4
pip ตรึงยังคงแสดงรายการแพ็คเกจที่ฉันใช้เป็นเวอร์ชันปิดล่วงหน้า และไม่ใช่การชำระเงิน GitHub โดยตรง
Antoine Claval

4
คุณต้องใช้ตัวเลือก `-e 'สำหรับ' pip freeze 'เพื่อสร้าง url
Janusz Skonieczny

2
pip 9.0.1:no such option: -e
sds

คุณหมายถึงgit+httpsอะไร ในข้อความที่คุณพูดgit+gitและในรหัสgit+https
Antony Hatchkins

@AntonyHatchkins แก้ไขแล้ว
osa

17

ตั้งแต่ pip v1.5, (เผยแพร่เมื่อ 1 มกราคม 2014: CHANGELOG , PR ) คุณอาจระบุไดเรกทอรีย่อยของ repo git เพื่อเก็บโมดูลของคุณ ไวยากรณ์มีลักษณะดังนี้:

pip install -e git+https://git.repo/some_repo.git#egg=my_subdir_pkg&subdirectory=my_subdir_pkg # install a python package from a repo subdirectory

หมายเหตุ: ในฐานะผู้เขียนโมดูล pip คุณควรจะเผยแพร่โมดูลของคุณใน repo ระดับบนของตัวเองถ้าคุณทำได้ คุณลักษณะนี้มีประโยชน์สำหรับ repos ที่มีอยู่แล้วที่มีโมดูล python ในไดเรกทอรีย่อย คุณอาจถูกบังคับให้ติดตั้งด้วยวิธีนี้หากไม่ได้เผยแพร่ไปยัง pypi


1

ฉันพบว่ามันเป็นเรื่องยากที่จะรับ pip3 (v9.0.1 ซึ่งติดตั้งโดยตัวจัดการแพคเกจของ Ubuntu 18.04) เพื่อติดตั้งสิ่งที่ฉันบอกให้ติดตั้งจริง ๆ ฉันโพสต์คำตอบนี้เพื่อประหยัดเวลาของทุกคนที่พบปัญหานี้

การนำสิ่งนี้ลงในไฟล์ requirements.txt ล้มเหลว:

git+git://github.com/myname/myrepo.git@my-branch#egg=eggname

โดย "ล้มเหลว" ฉันหมายความว่าในขณะที่มันดาวน์โหลดรหัสจาก Git มันก็จบลงด้วยการติดตั้งรหัสดั้งเดิมตามที่พบใน PyPi แทนที่จะเป็นรหัสใน repo ในสาขานั้น

อย่างไรก็ตามการติดตั้งการยอมรับแทนชื่อสาขาใช้งานได้:

git+git://github.com/myname/myrepo.git@d27d07c9e862feb939e56d0df19d5733ea7b4f4d#egg=eggname

คุณแน่ใจหรือว่าสาขาของคุณอยู่ห่างไกล
Alfe

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