Nếu tôi xây dựng một gói từ nguồn, làm thế nào tôi có thể gỡ cài đặt hoặc gỡ bỏ hoàn toàn?


137

Tôi đã sử dụng mã nguồn để xây dựng một gói như dưới đây:

./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

Nhưng thật không may, tôi phát hiện ra rằng đó là phiên bản mới nhất và có rất nhiều lỗi, vì vậy tôi cần phải gỡ bỏ / gỡ cài đặt nó. Nhưng làm thế nào tôi có thể làm như vậy? Tôi đã thử make clean; make uninstallnhưng tôi vẫn thấy nó tồn tại:

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

Làm thế nào để bạn loại bỏ điều này bây giờ?

Câu trả lời:


177

Thông thường bạn chỉ có thể sử dụng:

make uninstall

hoặc là

sudo make uninstall

nếu ứng dụng đã được cài đặt là root.

Nhưng điều này sẽ chỉ hoạt động nếu nhà phát triển gói đã quan tâm đến việc thực hiện quy tắc gỡ cài đặt tốt.

Bạn cũng có thể thử xem các bước được sử dụng để cài đặt phần mềm bằng cách chạy:

make -n install

Và sau đó cố gắng đảo ngược các bước đó bằng tay.

Trong tương lai để tránh loại vấn đề đó, hãy cố gắng sử dụng checkinstallthay vì make installbất cứ khi nào có thể (luôn luôn AFAIK trừ khi bạn muốn giữ cả phiên bản được biên dịch và đóng gói cùng một lúc). Nó sẽ tạo và cài đặt một tệp gỡ lỗi mà sau đó bạn có thể gỡ cài đặt bằng trình quản lý gói yêu thích của mình.

make cleanthường làm sạch các thư mục tòa nhà, nó không gỡ cài đặt gói. Nó được sử dụng khi bạn muốn chắc chắn rằng toàn bộ nội dung được biên dịch, không chỉ các tệp đã thay đổi.


Tôi cũng đã làm điều đó. Nhưng nó vẫn tồn tại, như được hiển thị pkg-config và ls /usr/lib/myplugin/libXYZ.so
YumYumYum

36
1 cho việc sử dụng checkinstall- nó làm cho toàn bộ vấn đề bốc hơi này.
Oli

6
@Google: Nếu việc gỡ cài đặt không hoạt động, bạn sẽ cần theo dõi những gì đã thực hiện cài đặt và hoàn tác thủ công.
Javier Rivera

4
Một lưu ý khác là nếu make installđược chạy dưới quyền root (ví dụ sudo make install:), thường là trường hợp, thì ảo luôn cần thiết để chạy sudo make uninstallđể gỡ bỏ phần mềm.
Eliah Kagan

5
Nếu bạn đã chạy make install, bạn vẫn có thể sử dụng checkinstall. Thông thường checkinstallsẽ ghi đè lên tất cả mọi thứ mà make installtạo ra. Sau đó chỉ cần sử dụng dpkg -r <package.deb>, và mọi thứ nên được gỡ bỏ.
user502144

28

Tôi không nghĩ rằng đây là một lỗi, nó sẽ là một ý tưởng tốt để đọc và tìm hiểu để sử dụng checkinstall khi cài đặt từ nguồn.

bạn có thể cài đặt checkinstall từ kho, một mô tả ngắn về gói;

CheckInstall theo dõi tất cả các tệp được tạo hoặc sửa đổi bởi tập lệnh cài đặt của bạn ("make install" "make install_modules", "setup", v.v.), xây dựng gói nhị phân tiêu chuẩn và cài đặt nó trong hệ thống của bạn cho bạn khả năng gỡ cài đặt nó với tiện ích quản lý gói tiêu chuẩn phân phối của bạn.

Những liên kết dưới đây có thể hữu ích để hiểu rõ hơn. http://en.wikipedia.org/wiki/CheckInstall

http://checkinstall.izto.org/


16

Đây không phải là một lỗi - biên dịch từ nguồn là một phương pháp cài đặt phần mềm không được hỗ trợ mà bỏ qua hệ thống quản lý gói (được Trung tâm phần mềm sử dụng) hoàn toàn.

Không có cách tiêu chuẩn nào mà phần mềm được biên dịch từ nguồn được cài đặt hoặc gỡ cài đặt để không có cách nào Ubuntu có thể biết phải làm gì. Phần mềm thậm chí không được liệt kê là một chương trình được cài đặt.

Bạn nên làm theo hướng dẫn của nhà phân phối để cài đặt và gỡ bỏ phần mềm tùy chỉnh đó. Bạn cũng có thể liên hệ với nhà phát triển để yêu cầu họ tạo gói Debian để có thể sử dụng hệ thống quản lý gói.


3

Nó không phải là một lỗi, đó là những gì xảy ra khi các nhà phát triển sử dụng phân phối thông qua nguồn và không thông qua các phương thức đóng gói riêng.

Bạn có thể nhận được các tệp nguồn của mình để trở thành các gói debian bằng cách sử dụng checkinstall hoặc dhbuild. Thành thật mà nói, theo tôi - người dùng mới nên tránh cài đặt từ nguồn và nhà phát triển chỉ nên tránh phân phối theo nguồn.


Tôi biết nhưng đôi khi điều đó là không thể tránh khỏi ... Trong trường hợp này, đó chỉ là một trò chơi nhỏ không thực sự cần thiết nhưng đôi khi tôi phải cài đặt MATLAB một công cụ tính toán được sử dụng trong trường đại học của tôi và phải cài đặt nó từ nguồn. không có tệp gỡ lỗi cho Ubuntu ... Nhưng tôi chắc chắn sẽ thực hiện các phương thức checkinstall và dhbuild ... cảm ơn
nik90

1

Tôi biết một vài gói hỗ trợ "thực hiện gỡ cài đặt" nhưng nhiều gói khác hỗ trợ cài đặt DESTDIR = xxx "cho các cài đặt theo giai đoạn.

Bạn có thể sử dụng điều này để tạo một gói mà bạn cài đặt thay vì cài đặt trực tiếp từ nguồn. Tôi không có may mắn với checkinstall nhưng fpm hoạt động rất tốt.

Điều này cũng có thể giúp bạn loại bỏ một gói được cài đặt trước đó bằng cách sử dụng make install . Bạn chỉ cần buộc cài đặt gói đã xây dựng của bạn qua gói đã cài đặt và sau đó gỡ cài đặt gói đó.

Ví dụ, tôi đã sử dụng điều này gần đây để đối phó với protobuf-3.3.0. Trên 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      

Thích yum đến vòng / phút nếu bạn có thể.

Trên 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

Thích apt để dpkg nơi bạn có thể.

Tôi cũng đã đăng câu trả lời này trên stackoverflow


0

Chúng ta cần phải đàm phán thực tế là làm cho gỡ bỏ cài đặt sẽ không luôn luôn làm việc, vì vậy dưới đây là chi tiết của một giải pháp tích cực.

Điều này liên quan đến việc sử dụng chương trình paco có sẵn trong Trung tâm phần mềm Ubuntu. Khi chúng tôi đã cài đặt paco, chúng tôi có thể sử dụng nó ở chế độ nhật ký khi chúng tôi "thực hiện cài đặt" một chương trình. Paco hoạt động như một trình bao bọc cho "make install" của bạn và tạo một nhật ký trong thư mục / var / log / paco với danh sách các tệp được sao chép vào các thư mục khác nhau. Hơn nữa, bạn có thể thấy các tập tin trong Paco Front end.

Ví dụ khi tôi biên dịch php từ nguồn, tôi đã làm như sau:

paco -lp php5 "make install"

Tham số l làm cho paco chạy trong chế độ nhật ký. Điều này đã tạo một tệp nhật ký trong / var / log / paco có tên php5 (tên tôi đã đặt trong lệnh). Nó chứa tất cả các tệp được sao chép vào các vị trí tiêu chuẩn khác nhau trong quá trình cài đặt. Bạn có thể sử dụng trình chỉnh sửa dòng lệnh hoặc paco gui để xem các tệp.

Dưới đây là ví dụ về việc lấy danh sách tệp bằng trình soạn thảo dòng lệnh sed
(Thay thế php5 bằng tên tệp của bạn).

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

Khi bạn đã có danh sách các tập tin, bạn có biết cách xóa chúng không? Thật vậy, bạn có thể chuyển kết quả của lệnh trên cho rm bằng cách sử dụng backticks như hiển thị bên dưới:

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

Công việc hoàn thành!

Lưu ý: Do các giới hạn LD_PRELOAD, paco không thể theo dõi các chương trình tuyệt vời. Xem trang người đàn ông.


0

Tôi đã biên dịch php-5.6.30 từ nguồn mà không cấu hình nó với openssl, vì vậy tôi phải quay lại và cài đặt nó từ đầu. Sử dụng cài đặt khiến cho việc gỡ cài đặt không hoạt động vì Makefile cho php không hỗ trợ.

Tuy nhiên, bước này hiệu quả với tôi, - Tôi đã liệt kê tất cả các tệp liên quan đến php và xóa chúng theo cách thủ công, tôi mất khoảng 5 phút mà không bị đổ mồ hôi. Bạn có thể sử dụng các bước tương tự để gỡ cài đặt phần mềm đã biên dịch của mình.

Thay thế php bằng phần mềm bạn cần gỡ cài đặt

whereis php

Lệnh trên liệt kê các thư mục nơi các tệp nhị phân được cài đặt, ví dụ: / usr / local / bin / php, / usr / bin / php .. xóa từng tệp / thư mục được liệt kê trong đầu ra của bạn.

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

Thực hiện việc này với tất cả các tệp được liệt kê ở đầu ra ở trên và bạn đã sẵn sàng cài đặt phiên bản mới hơn từ đầu.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.