Cách tốt nhất để gỡ cài đặt gem khỏi dự án rails3 là gì?


102

Tôi đã cài đặt tất cả các đá quý của mình bằng cách sử dụng Bundler thông qua Gemfile. Tôi đã nghĩ (nhầm) rằng nếu tôi xóa một viên ngọc khỏi Gemfile của mình và chạy 'cài đặt gói' thì các viên đá quý đã xóa sẽ được gỡ cài đặt. Tôi đã xem tệp trợ giúp của gói và theo như tôi có thể biết, nó không có cách nào để gỡ cài đặt các gem.

Tôi có chỉ sử dụng gem gỡ cài đặt x cho mọi thứ không? Điều này có gây nhầm lẫn cho người bó không?

Câu trả lời:


136

Bundler được khởi chạy từ thư mục gốc của ứng dụng, vì vậy nó đảm bảo tất cả các gem cần thiết đều có mặt để ứng dụng của bạn hoạt động. Nếu vì lý do nào đó bạn không cần gem nữa, bạn sẽ phải chạy

    gem uninstall gem_name 

như bạn đã nêu ở trên. Vì vậy, mỗi khi bạn chạy Bundler, nó sẽ kiểm tra lại các phần phụ thuộc

EDIT - 24.12.2014

Tôi thấy rằng mọi người tiếp tục đến với câu hỏi này, tôi quyết định thêm một chút gì đó. Câu trả lời mà tôi đưa ra là dành cho trường hợp bạn duy trì đá quý trên toàn cầu. Cân nhắc sử dụng trình quản lý đá quý chẳng hạn như rbenv hoặc rvm để giữ các bộ đá quý trong phạm vi các dự án cụ thể.

Điều này có nghĩa là không có gem nào sẽ được cài đặt ở cấp độ toàn cầu và do đó khi bạn xóa một gem khỏi Gemfile của dự án và chạy lại gói thì hiển nhiên nó sẽ không được tải trong dự án của bạn. Sau đó, bạn có thể chạy gói sạch (với dự án dir) và nó sẽ xóa khỏi hệ thống tất cả các đá quý đã từng được cài đặt khỏi Gemfile của bạn (trong cùng một dir) nhưng tại thời điểm này không còn được liệt kê ở đó nữa .... câu chuyện dài ngắn - nó loại bỏ những viên ngọc không sử dụng.


98

Thao tác này sẽ gỡ cài đặt một viên ngọc được cài đặt bởi Bundler:

bundle exec gem uninstall GEM_NAME

Lưu ý rằng điều này ném

LỖI: Trong khi thực thi gem ... (NoMethodError) phương thức không xác định `xóa 'cho # <Bundler :: SpecSet: 0x00000101142268>

nhưng viên ngọc thực sự đã bị loại bỏ. Lần tới khi bạn chạy bundle install, gem sẽ được cài đặt lại.


10
Đối với người dùng RVM: bạn phải sử dụng phương pháp này nếu bạn đã thiết lập bộ đá quý cho dự án cụ thể của mình. Chạy gem uninstall pgtừ thư mục dự án sẽ gỡ bỏ cài đặt pg từ mức hệ thống / gemset toàn cầu của bạn thay vì bundler của
Eric Hồ

Đây có phải là lỗi bạn đang đề cập đến? ERROR: While executing gem ... (NoMethodError) undefined method `delete' for #<Bundler::SpecSet:0x00000101142268>
user664833 29/02/12

+1 để làm điều đó trong ngữ cảnh gói. ước gì nó không ném ra lỗi đó! tốt hơn nữa, ước gì tôi có thể gói -f cập nhật gemname.
pduey

2
@EricHu thì không nếu bạn đang sử dụng bộ đá quý RVM. bất cứ khi nào bạn cài đặt một viên ngọc bằng gem install xxx bên trong bộ đá quý RVM, nó sẽ ở đó, vì vậy thực hiện gỡ cài đặt một viên ngọc đơn giản xxx trên bộ đá quý RVM sẽ xóa đá quý được cài đặt trên bộ đá quý đó chứ không phải cho hệ thống.
Esteban Feldman

@EstebanFeldman, bạn nói đúng, tôi nghĩ đây là một thay đổi được thực hiện đối với RVM trong 11 tháng qua.
Eric Hu

21

Với các phiên bản mới hơn của Bundler, bạn có thể sử dụng tác vụ sạch:

$ bundle help clean
Usage:
    bundle clean

Options:
    [--dry-run=only print out changes, do not actually clean gems]
    [--force=forces clean even if --path is not set]
    [--no-color=Disable colorization in output]
    -V, [--verbose=Enable verbose output mode]

Cleans up unused gems in your bundler directory
$ bundle clean --dry-run --force
Would have removed actionmailer (3.1.12)
Would have removed actionmailer (3.2.0.rc2)
Would have removed actionpack (3.1.12)
Would have removed actionpack (3.2.0.rc2)
Would have removed activemodel (3.1.12)
...

biên tập:

Điều này không được khuyến nghị nếu bạn đang sử dụng bộ đá quý toàn cầu (tức là - tất cả các dự án của bạn đều giữ đá quý của chúng ở cùng một vị trí). Tuy nhiên, có một số cách để giữ các viên ngọc của mỗi dự án riêng biệt:

  1. rvmgemsets ( http://rvm.io/gemsets/basics )
  2. bundle installvới bất kỳ tùy chọn nào sau đây: --deploymenthoặc --path=<path>( http://bundler.io/v1.3/man/bundle-install.1.html )

Sử dụng bundle clean --forceđã loại bỏ một loạt đá quý mà tôi không sử dụng trong dự án hiện tại của mình nhưng lại sử dụng trong các dự án khác của tôi. Tôi có nên thiết lập một con đường không? Chỉ bundle cleantrả về "Chỉ có thể sử dụng gói sạch khi --path được đặt hoặc --force được đặt". Nhưng --pathtùy chọn thậm chí không xuất hiện trong trợ giúp.
Dennis

1
Đúng vậy @Dennis. Các cleannhiệm vụ không thực sự có ý nghĩa nếu bạn đang sử dụng một gemset toàn cầu. Nhưng nếu bạn muốn, mỗi dự án của bạn có thể có những viên ngọc riêng biệt. Bạn có thể làm như vậy thông qua rvm gemsets ( rvm.io/gemsets/basics ) hoặc bằng cách chỉ định đường dẫn --pathcủa gem thông qua tùy chọn của bundle install( Bundler.io/v1.3/man/bundle-install.1.html )
Evgenia Manolova

1

Bạn phải sử dụng 'gem uninstall gem_name' để gỡ cài đặt gem.

Lưu ý rằng nếu bạn đã cài đặt gem trên toàn hệ thống (tức là. Cài đặt gói sudo) thì bạn có thể cần chỉ định thư mục nhị phân bằng cách sử dụng tùy chọn -n, để đảm bảo các tệp nhị phân thuộc về gem bị xóa. Ví dụ

sudo gem uninstall gem_name  -n /usr/lib/ruby/gems/1.9.1/bin

1

Tôi dường như đã giải quyết vấn đề này bằng cách gỡ bỏ viên ngọc kỳ lân theo cách thủ công thông qua tệp Bundler ("sudo Bundler execute gem unicorn uninstall"), sau đó hoàn lại tiền ("cài đặt gói sudo").

Tuy nhiên, không chắc tại sao nó lại xảy ra, mặc dù bản sửa lỗi ở trên dường như hoạt động.


1

Nếu bạn muốn làm sạch tất cả đá quý của mình và bắt đầu lại

sudo gem clean

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.