วิธีใช้แพ็คเกจมาตรฐานของฉันเอง


10

ฉันพบปัญหากับ Nautilus ซึ่งฉันไม่พบวิธีแก้ไขปัญหาอื่นนอกจากดาวน์โหลดซอร์สโค้ดทำการเปลี่ยนแปลงและรวบรวมด้วยตัวเอง ดังนั้นตอนนี้ฉันมี nautilus สองรุ่นคือรุ่นอย่างเป็นทางการจากที่เก็บและเหมืองที่มีการเปลี่ยนแปลงเล็กน้อย ฉันต้องการเก็บทั้งสองอย่าง

อะไรจะเป็นวิธีที่ดีในการบอกแอปพลิเคชันให้ใช้ Nautilus รุ่นรวบรวมของฉันเองเมื่อเริ่มต้น Nautilus จากภายในแอปพลิเคชัน (เช่นเปิดโฟลเดอร์ดาวน์โหลดด้วย firefox)

ฉันพบว่าการโทรของ Firefox /usr/bin/nautilusนั้นฉันสามารถแทนที่มันด้วย symlink ในโปรแกรมของฉันเอง อย่างไรก็ตามฉันเชื่อว่า symlink นี้จะถูกเขียนทับทันทีที่ฉันติดตั้งการอัปเดตสำหรับ Nautilus มีอะไรอีกบ้างที่ฉันสามารถทำได้?

debian  apt 

1
การวางเวอร์ชันของคุณ/usr/local/binไม่ทำงาน เช่น Firefox ของคุณทำการค้นหา$PATHและค้นหารุ่นใน/usr/binหรือไม่ (หรือสิ่งที่ xdg-open ของคุณ) รหัสยาก/usr/bin/nautilus? การติดตั้งเวอร์ชันของคุณเองใน / usr / local สามารถใช้งานได้ตามปกติ
Peter Cordes

ฉันลองสิ่งนี้ในตอนนี้และมันไม่ทำงาน ฉันไม่รู้ว่า firefox ทำอะไรได้บ้างภายใน แต่/usr/bin/nautilusดูเหมือนว่าจะใช้รหัสยาก ถ้ามันจะถูกลบออก Firefox ไม่ได้ทำอะไรอีกต่อไปเมื่อฉันพยายามที่จะเปิดโฟลเดอร์ Downloads ถึงแม้จะมี symlink /usr/local/binไปรุ่นของตัวเองในหอยโข่ง $PATHตัวแปรของฉันคือ/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

หากคุณสงสัยคุณสามารถเรียกใช้strace -f -efile,execve -o firefox_syscalls.txt firefoxเพื่อดูว่า ff ทำอะไร หากคุณค้นหาบันทึกnautilusที่อาจแสดงให้คุณเห็นบางอย่าง (ที่-eกรองระบบเรียกexecveและเปิดไฟล์ / ปิด / ชื่อพา ธ มิฉะนั้นมันจะท่วมท้นfutexและซ็อกเก็ตการอ่าน / เขียนสำหรับ X11)
Peter Cordes

คำตอบ:


14

ฉันจะแก้ไข Nautilus เวอร์ชันแพคเกจซึ่งอาจดูน่ากลัวในตอนแรก แต่ก็ง่ายพอ - แม้ว่ามันจะไม่รอดจากการอัพเกรดแพ็คเกจดังนั้นมันจึงต้องมีวินัย (ดูคำตอบของ Wouterสำหรับรายละเอียด)

วิธีที่ง่ายที่สุดในสถานการณ์ของคุณคือการเพิ่มการเบี่ยงเบน:

sudo dpkg-divert --divert /usr/bin/nautilus.original --rename /usr/bin/nautilus

สิ่งนี้จะแนะนำdpkgให้เปลี่ยนชื่อ/usr/bin/nautilusเป็น/usr/bin/nautilus.originalเมื่อใดก็ตามที่แพคเกจพยายามติดตั้ง จากนั้นคุณสามารถเพิ่ม symlink ของคุณเองและมันจะยังคงไม่ถูกแตะต้องแม้เมื่อมีการอัพเกรดแพ็คเกจ Nautilus หากต้องการลบออกให้เรียกใช้

sudo dpkg-divert --rename --remove /usr/bin/nautilus

คุณสามารถใช้เทคนิคเดียวกันกับไฟล์อื่น ๆ ที่คุณต้องการแทนที่ในลักษณะเดียวกันนอกเหนือจากไฟล์การกำหนดค่าบางอย่างที่ไม่ได้รับการจัดการอย่างถูกต้องเมื่อโอนสาย


7

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

สมมติว่าคุณทำเช่นนั้นจนกว่าการเปลี่ยนแปลงนั้นจะไหลลงสู่ระบบของคุณคุณจะยังคงต้องจัดการกับปัญหาที่ต้องการใช้หอยโข่งรุ่นปรับปรุงของคุณเอง

วิธีที่ง่ายที่สุดคือการผลิตแพคเกจของ nautilus โดยใช้โปรแกรมปะแก้แล้วและทำการติดตั้งในลักษณะที่มันจะไม่ถูกอัพเกรดโดยอัตโนมัติ

บน Debian (ซึ่งตามแท็กในคำถามนี้ที่คุณกำลังใช้) วิธีที่ง่ายที่สุดในการทำให้สำเร็จคือ:

apt-get install devscripts
apt-get build-dep nautilus # note, this also pulls in build-essential
apt-get source nautilus
cd nautilus-*
# apply your patch
dch -i
# Set the version number of the new changelog entry to something like x.y.z-a.local,
# where "x.y.z-a" is the version of the package as it existed prior to your patch,
# add a description of the change after the '*', then save and exit the editor
debuild -uc -us -i && sudo debi --upgrade
echo "nautilus hold" | sudo dpkg --set-selections

สิ่งนี้จะสร้างแพ็คเกจใหม่ด้วยแพตช์ของคุณติดตั้งแล้วทำเครื่องหมายเป็น dpkg เพื่อไม่ให้อัปเดตอัตโนมัติอีกต่อไป

ในครั้งต่อไปที่แพ็คเกจที่อัพเดตจะออกวางจำหน่าย apt จะแจ้งให้คุณทราบว่ามีเวอร์ชันที่อัปเดตแล้ว แต่กำลังถูกระงับ จากนั้นคุณต้องทำตามข้างบนอีกครั้ง


apt-mark hold packagenameเป็นวิธีที่ทันสมัยในการถือแพคเกจ (ฉันทำเองdpkg-hold/ dpkg-unholdสคริปต์ที่dlocateใช้apt-markแทนdpkg --set-selectionsวิธีที่พวกเขาใช้มานานหลายปีสคริปต์ล้าสมัยเพราะ apt-mark แต่ฉันยังมีสคริปต์อื่น ๆ ที่เรียกพวกเขาและการลบออกอาจทำให้สคริปต์ที่เขียนโดยผู้ใช้รายอื่น แพคเกจ dlocate) ที่
cas

ส่วนที่ถูกพักไว้man apt-markพูดว่าThe command is only a wrapper around dpkg --set-selections and the state is therefore maintained by dpkg(1) and not affected by the --file optionดังนั้นฉันคิดว่านั่นเป็นสิ่งเล็กน้อย ;-)
Wouter Verhelst
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.