ฉันจะอัพเกรดแพ็คเกจเฉพาะโดยใช้ pip และไฟล์ข้อกำหนดได้อย่างไร


436

ฉันกำลังใช้ pip กับไฟล์ข้อกำหนดใน virtualenv สำหรับโครงการ Django ของฉัน ฉันพยายามอัพเกรดแพ็คเกจโดยเฉพาะอย่างยิ่ง Django และฉันได้รับข้อผิดพลาดเกี่ยวกับความขัดแย้งของซอร์สโค้ด:

Source in `<virtualenv`>/build/Django has version 1.2.3 that conflicts with Django==1.2.4 (from -r requirements/apps.txt (line 3))

หลังจากอัปเดตหมายเลขเวอร์ชันของ Django จาก 1.2.3 เป็น 1.2.4 ในไฟล์ข้อกำหนดของฉันแล้ว ฉันใช้คำสั่งนี้ทำการอัปเกรดจริง:

pip --install --upgrade -E `<virtualenv dir`> --requirement `<requirements file`>

ฉันไม่พบการตั้งค่าสถานะใด ๆ ที่กระตุ้นให้มีการดาวน์โหลดซ้ำแพ็คเกจ ฉันลองใช้คำสั่งถอนการติดตั้งก่อนจากนั้นทำการติดตั้ง แต่ไม่มีลูกเต๋า บางทีฉันอาจจะหายไปบางอย่าง


1
โปรดตรวจสอบคำตอบของ @ dr-jimbob เนื่องจาก pip รุ่นล่าสุดจะอัพเกรดการอ้างอิงอื่น ๆ ทั้งหมดที่แพ็กเกจที่คุณกำลังอัพเกรดนั้นขึ้นอยู่กับ
Lokesh Meher

คำตอบ:


61

ฉันไม่แน่ใจว่ามันเป็นปัญหาของคุณหรือไม่ แต่ในกรณีของฉันฉันไม่สามารถอัพเกรด Django เป็น 1.2.4 ได้ - ฉันเสร็จด้วยรุ่น 1.2.3 เสมอดังนั้นฉันจึงถอนการติดตั้ง Django ด้วย:

<virtualenv>/bin/pip uninstall Django

จากนั้นฉันลบ<virtualenv>/build/Djangoไดเรกทอรีและในที่สุดฉันก็ติดตั้งรุ่นที่เหมาะสมด้วย:

<virtualenv>/bin/pip install Django

หวังว่าจะช่วยได้


53
นี่ไม่ใช่วิธีปฏิบัติที่ดีที่สุด ใช้pip install Django -Uหรือpip install Django --upgradeตามที่อธิบายไว้ในคำตอบของ @JoeyG
Ahmad

@Ahmad เห็นด้วย ควรมีกระบวนการอัพเดตที่ราบรื่นใน pip และ virtual env
Parth Joshi

1271

ฉันรันคำสั่งต่อไปนี้และอัพเกรดจาก 1.2.3 เป็น 1.4.0

pip install Django --upgrade

แป้นพิมพ์ลัดสำหรับอัพเกรด:

pip install Django -U

หมายเหตุ : ถ้าแพ็คเกจที่คุณกำลังอัพเกรดมีข้อกำหนดใด ๆ คำสั่งนี้จะทำการอัพเกรดข้อกำหนดทั้งหมดเป็นเวอร์ชั่นล่าสุดที่มีให้เพิ่มเติม ในรุ่นล่าสุดของ pip, คุณสามารถป้องกันปัญหานี้โดยการระบุ --upgrade-strategy only-if-neededด้วยการตั้งค่าสถานะนั้นการอ้างอิงจะไม่ถูกปรับรุ่นเว้นแต่รุ่นที่ติดตั้งของแพคเกจที่อ้างถึงไม่ตอบสนองความต้องการของแพคเกจที่ปรับรุ่นแล้ว


7
สิ่งนี้สำหรับฉันอัปเดตทุกชุดของฉันและเลอะทุกอย่าง !!!! สถานะเอกสาร: - อัปเกรดแพ็กเกจทั้งหมดเป็นเวอร์ชันใหม่ล่าสุดที่มี สิ่งนี้ถูกต้องหรือว่าฉันทำอะไรผิดพลาด?
โพร

4
@OrbiterFleet ฉันจำเป็นต้องอัปเดต "คำขอ" ดังนั้นฉันจึงทำpip install Requests --upgradeและมีเพียง "คำขอ" ที่ได้รับการอัปเกรด คำอธิบายแจ้งว่า "อัปเกรดแพ็คเกจที่ระบุทั้งหมด" เมื่อฉันดูเอกสาร
harperville

31
ความสนใจมันยังอัพเดตการพึ่งพาทั้งหมดและสามารถยุ่งกับทุกสิ่ง ตัวเลือกที่ดีที่สุดคือการถอนการติดตั้งและติดตั้งแพคเกจใหม่
marcelosalloum

3
เพื่ออัปเกรดการใช้แพ็คเกจโดยเฉพาะpip install --upgrade django==1.4.0
whale_steward

นี่ควรเป็นคำตอบที่ถูกต้องตามคำถามหรือเป็นคำถามที่ผิด
soumen int

51

ตาม pip docsตัวอย่าง 3

pip install --upgrade django

แต่จากประสบการณ์ของฉันการใช้วิธีนี้จะอัปเกรดแพ็คเกจที่เกี่ยวข้องด้วย ตัวอย่าง:

สมมติว่าคุณต้องการอัพเกรดsomepackageที่ต้องdjango >= 1.2.4ใช้วิธีการนี้มันจะอัปเกรดsomepackageและdjangoเป็นอัปเดตล่าสุด เพียงเพื่อความปลอดภัยทำ:

# assume you want to keep django 1.2.4
pip install --upgrade somepackage django==1.2.4

การทำเช่นนี้จะอัปเกรดsomepackageและรักษา django เป็นเวอร์ชัน 1.2.4


จับได้ดี แต่คำอธิบายของคุณสับสนตั้งแต่คุณเริ่มต้นด้วยdjangoแพ็คเกจหลักในตัวอย่างที่คุณใช้somepackageแล้วใช้djangoเป็นการอ้างอิง
ยาว

34

คำสั่งทางลัดสำหรับ--upgrade:

pip install Django --upgrade

คือ:

pip install Django -U

7
วิธีแก้ไขเกี่ยวกับคำตอบที่มีอยู่เพื่อเพิ่มข้อมูลนี้แทนที่จะเป็นคำตอบ (ไม่สมบูรณ์)?
a1an

@ a1an โปรดแนะนำข้อมูลเพิ่มเติมที่คุณคิดว่าควรเพิ่มใน "การแก้ไขที่แนะนำ" ขอบคุณ
Aaron Lelevier

4
ฉันหมายความว่าคุณสามารถแก้ไขคำตอบที่ได้รับจาก JoeyG โดยเพิ่มตัวเลือกทางลัดที่คุณให้ไว้ในบริบทที่นั่น
a1an

17

หากคุณอัพเกรดแพ็คเกจแพ็คเกจเก่าจะถูกถอนการติดตั้ง

วิธีที่สะดวกในการทำเช่นนี้คือการใช้pip-upgraderซึ่งอัพเดตเวอร์ชั่นในrequirements.txtไฟล์ของคุณสำหรับแพ็คเกจที่เลือก (หรือแพ็คเกจทั้งหมด)

การติดตั้ง

pip install pip-upgrader

การใช้

เปิดใช้งาน virtualenv ของคุณ (สำคัญเพราะมันจะติดตั้งแพ็คเกจอัพเกรดรุ่นใหม่ใน virtualenv ปัจจุบันด้วย)

cd ลงในไดเรกทอรีโครงการของคุณแล้วเรียกใช้:

pip-upgrade

การใช้งานขั้นสูง

หากวางข้อกำหนดไว้ในตำแหน่งที่ไม่ได้มาตรฐานให้ส่งเป็นอาร์กิวเมนต์:

pip-upgrade path/to/requirements.txt

หากคุณรู้อยู่แล้วว่าต้องการอัปเกรดแพ็คเกจใดเพียงส่งเป็นอาร์กิวเมนต์:

pip-upgrade -p django -p celery -p dateutil

หากคุณต้องการอัปเกรดเป็นรุ่นก่อนวางจำหน่าย / หลังวางจำหน่ายให้เพิ่ม--prereleaseอาร์กิวเมนต์ในคำสั่งของคุณ

การเปิดเผยแบบเต็ม: ฉันเขียนแพ็คเกจนี้ หวังว่ามันจะช่วย


1
มีตัวเลือกในการอัพเกรดแพ็คเกจทั้งหมดในครั้งเดียว (เช่นที่ไม่มีรายชื่อ) ด้วยวิธีการนี้หรือไม่?
Bjork หมายเลขหนึ่งแฟน

1
@ MikePalmice ใช่: pip-upgrade -p allจะอัปเกรดแพ็กเกจทั้งหมดของคุณและอัปเดตไฟล์ข้อกำหนดโดยไม่จำเป็นต้องป้อนข้อมูลใด ๆ จากคุณ
Simion Agavriloaei

15

หากคุณต้องการอัพเกรดแพ็คเกจที่เรียกว่าsomepackageคำสั่งที่คุณควรใช้ใน pip รุ่นล่าสุดเท่านั้น

pip install --upgrade --upgrade-strategy only-if-needed somepackage

สิ่งนี้มีประโยชน์มากเมื่อคุณพัฒนาแอปพลิเคชั่นใน django ซึ่งปัจจุบันจะทำงานกับ django เฉพาะรุ่น (เช่น Django = 1.9.x) และต้องการอัพเกรดแพ็คเกจที่ขึ้นต่อกันด้วยฟีเจอร์แก้ไขข้อบกพร่อง / ใหม่และแพ็คเกจที่อัพเกรดขึ้นอยู่กับ บน django (แต่ใช้งานได้กับ django เวอร์ชันใดก็ได้หลังจาก 1.5) พฤติกรรมเริ่มต้นของการpip install --upgrade django-some-packageจะปรับรุ่น django เป็นเวอร์ชั่นล่าสุดที่มีอยู่ซึ่งอาจทำให้แอปพลิเคชันของคุณแตกต่างไปจากนี้แม้ว่าจะมีการ--upgrade-strategy only-if-neededอัพเกรดแพ็คเกจตามที่จำเป็นเท่านั้น


4

โดยปกติ pip จะทำความสะอาดตัวเองและลบเนื้อหาของไดเรกทอรีสร้าง ครั้งเดียวที่มันไม่ทำคือถ้า:

  1. คุณใช้--no-installตัวเลือก
  2. คุณกำลังใช้แพ็คเกจที่แก้ไขได้
  3. การติดตั้งถูกยกเลิกหรือถูกขัดจังหวะ

ในกรณีอื่น ๆ คุณไม่ควรมีbuildไดเรกทอรีที่ขัดขวางสภาพแวดล้อมของคุณ


1

การกำหนดเวอร์ชันเฉพาะในการอัปเกรดช่วยฉันแทนคำสั่งอัปเกรดเท่านั้น

pip3 install larapy-installer==0.4.01 -U

0

ที่แก้ไขให้ฉันปัญหา "pip install -I - อัปเกรด psutil --force" หลังจากนั้นเพียงถอนการติดตั้ง psutil ด้วยเวอร์ชันใหม่และกระโดดคุณสามารถติดตั้งเวอร์ชั่นเก่าได้ทันที (:


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