หากฉันสร้างแพคเกจจากแหล่งข้อมูลฉันจะถอนการติดตั้งหรือลบอย่างสมบูรณ์ได้อย่างไร


137

ฉันใช้ซอร์สโค้ดเพื่อสร้างแพ็คเกจหนึ่งเช่นด้านล่าง:

./configure --prefix=/usr --sysconfdir=/etc --localstatedir=/var --libexecdir=/usr/lib --with-package-name="Myplugin" --with-package-origin="http://www.ubuntu.org/" --enable-gtk-doc --disable-static
make
make install

แต่น่าเสียดายที่ฉันค้นพบว่ามันเป็นเวอร์ชั่นล่าสุดและมีข้อบกพร่องมากมายดังนั้นฉันต้องลบออก / ถอนการติดตั้ง แต่ฉันจะทำอย่างไร ฉันพยายามmake clean; make uninstallแต่ก็ยังเห็นว่ามันมีอยู่:

# pkg-config --list-all | grep Myplugin
myplugin-....
$ ls /usr/lib/myplugin/libXYZ.so
exist....

คุณจะลบสิ่งนี้ได้อย่างไร

คำตอบ:


177

โดยปกติคุณสามารถใช้:

make uninstall

หรือ

sudo make uninstall

ถ้าติดตั้งแอปเป็นรูท

แต่จะใช้งานได้ก็ต่อเมื่อผู้พัฒนาแพคเกจจัดการดูแลกฎการถอนการติดตั้งที่ดี

คุณสามารถลองดูขั้นตอนที่ใช้ในการติดตั้งซอฟต์แวร์โดยเรียกใช้:

make -n install

จากนั้นลองย้อนกลับขั้นตอนเหล่านั้นด้วยตนเอง

ในอนาคตเพื่อหลีกเลี่ยงปัญหาประเภทนั้นให้ลองใช้checkinstallแทนmake installทุกครั้งที่เป็นไปได้ (AFAIK เสมอเว้นแต่คุณต้องการเก็บทั้งเวอร์ชันที่คอมไพล์และแพ็คเกจในเวลาเดียวกัน) มันจะสร้างและติดตั้งไฟล์ deb ที่คุณสามารถถอนการติดตั้งโดยใช้ตัวจัดการแพ็คเกจที่คุณชื่นชอบ

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


ฉันก็ทำเช่นนั้น แต่ก็ยังคงมีอยู่ดังที่แสดง pkg-config และ ls
/usr/lib/myplugin/libXYZ.so

36
+1 สำหรับการใช้checkinstall- ทำให้ปัญหาทั้งหมดนี้หายไป
Oli

6
@Google: หากการถอนการติดตั้งไม่ทำงานคุณจะต้องติดตามสิ่งที่ทำให้การติดตั้งทำได้และยกเลิกด้วยตนเอง
Javier Rivera

4
สิ่งที่ควรคำนึงถึงก็คือถ้าหากmake installเรียกใช้เป็นรูท (เช่นsudo make install) ซึ่งโดยทั่วไปแล้วเป็นกรณีจำเป็นที่จะต้องใช้เวอร์ชวลsudo make uninstallเพื่อลบซอฟต์แวร์
Eliah Kagan

5
ถ้าคุณได้ทำงานแล้วคุณยังสามารถใช้make install checkinstallโดยปกติcheckinstallจะเขียนทับทุกสิ่งที่make installสร้างขึ้น หลังจากนั้นเพียงแค่ใช้dpkg -r <package.deb>และทุกอย่างควรจะถูกลบออก
user502144

28

ฉันไม่คิดว่านี่เป็นข้อผิดพลาดมันเป็นความคิดที่ดีที่จะอ่านและเรียนรู้การใช้ checkinstall เมื่อติดตั้งจากแหล่งที่มา

คุณสามารถติดตั้ง checkinstall ได้จากที่เก็บคำอธิบายสั้น ๆ ของแพ็คเกจ

CheckInstall ติดตามไฟล์ทั้งหมดที่สร้างหรือแก้ไขโดยสคริปต์การติดตั้งของคุณ ("ทำการติดตั้ง" "ทำให้ install_modules", "การตั้งค่า" ฯลฯ ) สร้างแพ็คเกจไบนารีมาตรฐานและติดตั้งในระบบของคุณทำให้คุณสามารถถอนการติดตั้งได้ ยูทิลิตี้การจัดการแพ็คเกจมาตรฐานของการแจกจ่ายของคุณ

ลิงค์ด้านล่างนี้อาจเป็นประโยชน์ในการทำความเข้าใจให้ดีขึ้น http://en.wikipedia.org/wiki/CheckInstall

http://checkinstall.izto.org/


16

นี่ไม่ใช่ข้อผิดพลาดในการรวบรวมจากแหล่งที่มาเป็นวิธีการที่ไม่ได้รับการสนับสนุนในการติดตั้งซอฟต์แวร์ที่ข้ามระบบการจัดการบรรจุภัณฑ์ (ซึ่งใช้โดยศูนย์ซอฟต์แวร์) อย่างสมบูรณ์

ไม่มีวิธีมาตรฐานในการติดตั้งหรือถอนการติดตั้งซอฟต์แวร์ที่รวบรวมจากแหล่งที่มาดังนั้นทาง Ubuntu จึงไม่สามารถรู้ได้ว่าจะต้องทำอย่างไร ซอฟต์แวร์ไม่ได้อยู่ในรายการเป็นโปรแกรมที่ติดตั้ง

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


3

ไม่ใช่ข้อผิดพลาดมันเกิดขึ้นเมื่อนักพัฒนาหันไปแจกจ่ายผ่านแหล่งที่มาและไม่ผ่านวิธีการบรรจุภัณฑ์แบบดั้งเดิม

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


ฉันรู้ แต่บางครั้งก็หลีกเลี่ยงไม่ได้ ... ในกรณีนี้มันเป็นเพียงเกมเล็ก ๆ ที่ไม่จำเป็นจริงๆ แต่บางครั้งฉันต้องติดตั้ง MATLAB ซึ่งเป็นเครื่องมือคำนวณที่ใช้ในมหาวิทยาลัยของฉันและต้องติดตั้งโดยแหล่งตั้งแต่พวกเขาทำ ไม่มีไฟล์ deb สำหรับอูบุนตู ... แต่ฉันจะทำตามวิธีการตรวจสอบการติดตั้งและ dhbuild ... ขอบคุณ
nik90

1

ฉันรู้แพคเกจบางอย่างที่รองรับ "ถอนการติดตั้ง" แต่อีกมากมายที่รองรับทำการติดตั้ง DESTDIR = xxx "สำหรับการติดตั้งตามขั้นตอน

คุณสามารถใช้สิ่งนี้เพื่อสร้างแพ็คเกจที่คุณติดตั้งแทนการติดตั้งโดยตรงจากแหล่งที่มา ฉันไม่มีโชคกับ checkinstall แต่fpmทำงานได้ดีมาก

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

ตัวอย่างเช่นฉันใช้สิ่งนี้เมื่อเร็ว ๆ นี้เพื่อจัดการกับ protobuf-3.3.0 ใน RHEL7:

make install DESTDIR=dest
cd dest
fpm -f -s dir -t rpm -n protobuf -v 3.3.0 \
 --vendor "You Not RedHat" \
 --license "Google?" \
 --description "protocol buffers" \
 --rpm-dist el7 \
 -m you@youraddress.com \
 --url "http:/somewhere/where/you/get/the/package/oritssource" \
 --rpm-autoreqprov \
 usr

 sudo rpm -i -f protobuf-3.3.0-1.el7.x86_64.rpm
 sudo rpm -e protobuf-3.3.0      

ต้องการ yum ถึง rpm ถ้าทำได้

บน Debian9:

make install DESTDIR=dest
cd dest
fpm -f -s dir -t deb -n protobuf -v 3.3.0 \
-C `pwd` \
--prefix / \
--vendor "You Not Debian" \
--license "$(grep Copyright ../../LICENSE)" \
--description "$(cat README.adoc)" \
--deb-upstream-changelog ../../CHANGES.txt \
 --url "http:/somewhere/where/you/get/the/package/oritssource" \
 usr/local/bin \
 usr/local/lib \
 usr/local/include

 sudo apt install -f *.deb
 sudo apt-get remove protobuf

ชอบฉลาดถึง dkg ที่คุณสามารถทำได้

ฉันโพสต์คำตอบนี้ไว้ในstackoverflow ด้วย


0

เราจำเป็นต้องเจรจาความจริงที่ว่าการถอนการติดตั้งอาจไม่ได้ผลเสมอไปดังนั้นด้านล่างเป็นโซลูชันเชิงรุกมากกว่า

สิ่งนี้เกี่ยวข้องกับการใช้โปรแกรม paco ซึ่งมีอยู่ใน Ubuntu Software Center เมื่อเราติดตั้ง paco เราสามารถใช้โหมดบันทึกเมื่อเรา "ทำการติดตั้ง" โปรแกรม Paco ทำหน้าที่เหมือน wrapper สำหรับ "ทำการติดตั้ง" ของคุณและสร้างบันทึกในไดเรกทอรี / var / log / paco ด้วยรายการไฟล์ที่คัดลอกไปยังไดเรกทอรีต่าง ๆ นอกจากนี้คุณสามารถดูไฟล์ใน Paco Front end ได้

ตัวอย่างเช่นเมื่อฉันรวบรวม php จากแหล่งที่ฉันทำต่อไปนี้:

paco -lp php5 "make install"

พารามิเตอร์ l ทำให้ paco ทำงานในโหมดบันทึกซึ่งสร้างไฟล์บันทึกใน / var / log / paco ชื่อ php5 (ชื่อที่ฉันได้ให้ไว้ในคำสั่ง) มันมีไฟล์ทั้งหมดที่ถูกคัดลอกไปยังตำแหน่งมาตรฐานต่างๆในระหว่างการติดตั้ง คุณสามารถใช้เครื่องมือแก้ไขบรรทัดคำสั่งหรือ paco gui เพื่อดูไฟล์

ด้านล่างเป็นตัวอย่างของการรับรายการไฟล์โดยใช้ตัวแก้ไขบรรทัดคำสั่ง sed
(แทนที่ php5 ด้วยชื่อไฟล์ของคุณ)

cat /var/log/paco/php5 | sed -n 's/|\(.*\)//;/^#\(.*\)/d;p'

เมื่อคุณได้รับรายชื่อไฟล์คุณจะรู้วิธีการลบไฟล์เหล่านั้นใช่ไหม แน่นอนคุณสามารถส่งผลลัพธ์ของคำสั่งด้านบนไปที่rmโดยใช้ backticks ดังที่แสดงด้านล่าง:

sudo rm `cat /var/log/paco/php5 | sed -n 's/|\(.*\)//;/^#\(.*\)/d;p'`

งานเสร็จแล้ว!

หมายเหตุ: เนื่องจากข้อ จำกัด ของ LD_PRELOAD ทำให้ paco ไม่สามารถติดตามโปรแกรม suid ได้ ดูหน้าคน


0

ฉันรวบรวมphp-5.6.30จากแหล่งที่มาโดยไม่ต้องกำหนดค่าด้วย openssl ดังนั้นฉันต้องกลับไปและติดตั้งตั้งแต่เริ่มต้นการใช้การถอนการติดตั้งไม่ทำงานเนื่องจาก Makefile for php ไม่รองรับ

อย่างไรก็ตามขั้นตอนนี้ใช้งานได้สำหรับฉัน - ฉันแสดงรายการไฟล์ทั้งหมดที่เกี่ยวข้องกับ PHP และลบออกด้วยตนเองฉันใช้เวลาประมาณ 5 นาทีโดยไม่ทำให้เหงื่อออก คุณสามารถใช้ขั้นตอนเหล่านี้ในการถอนการติดตั้งซอฟต์แวร์ที่รวบรวม

แทนที่phpด้วยซอฟต์แวร์ที่คุณต้องการถอนการติดตั้ง

whereis php

คำสั่งข้างต้นจะแสดงรายการไดเรกทอรีที่มีการติดตั้งไบนารี: / usr / local / bin / php, / usr / bin / php .. ลบแต่ละไฟล์ / ไดเรกทอรีที่ระบุไว้ในการส่งออกของคุณ

sudo rm -f /usr/local/bin/php

ทำเช่นนี้กับไฟล์ทั้งหมดที่ระบุไว้ในผลลัพธ์ข้างต้นและคุณพร้อมที่จะติดตั้งเวอร์ชันใหม่ตั้งแต่ต้น

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