Làm cách nào tôi có thể chỉ định một viên ngọc địa phương trong Gemfile của mình?


Câu trả lời:


541

Tôi tin rằng bạn có thể làm điều này:

gem "foo", path: "/path/to/foo"

10
Đường dẫn được mã hóa tốt sẽ tốt cho phiên hack nhanh, nhưng giải pháp đá quý cục bộ của bloudermilk có hiệu quả hơn đối với các dự án dưới sự kiểm soát phiên bản. Nó cho phép bạn tiếp tục kiểm tra trong cả hai dự án - đá quý và dự án bằng cách sử dụng đá quý - sao cho những người khác không thể kiểm tra nguồn đá quý hoặc chia sẻ cùng một đường dẫn.
mahemoff

4
Bạn có thể làm cho điều này sạch hơn một chút bằng cách sử dụng một liên kết tượng trưng .gitignored đến gem cục bộ của bạn trong thư mục dự án của bạn - theo cách đó bạn có thể sử dụng kiểm soát nguồn trên cả hai dự án và các dự án khác có thể làm tương tự mà không cần cấu trúc thư mục giống hệt nhau.
Dan

7
Một cái gì đó để coi chừng có thể là mùa xuân. Nếu bạn đang sử dụng đường dẫn cục bộ cho đá quý của mình, bạn có thể nhận thấy các phiên bản được lưu trong bộ nhớ cache của đá quý cục bộ giống như tôi đã làm trong bảng điều khiển rails. Nếu có vẻ như những thay đổi đá quý địa phương của bạn đang được chọn hãy thử spring stopxem nó có thực sự là vấn đề không.
Jason R

1
Thêm đường dẫn đá quý cục bộ vào config / spring.rb dường như giúp lấy các thay đổi đá quý cục bộ của bạn sau khi khởi động lại bàn điều khiển / máy chủ rails.
Jason R

5
Cách tốt hơn để làm điều này ở đây: rossta.net/blog/
Cyzanfar

230

Ngoài việc chỉ định đường dẫn (như Jimmy đã đề cập), bạn cũng có thể buộc Bundler sử dụng đá quý cục bộ cho môi trường của mình chỉ bằng cách sử dụng tùy chọn cấu hình sau:

$ bundle config local.GEM_NAME /path/to/local/git/repository

Điều này cực kỳ hữu ích nếu bạn đang phát triển hai viên đá quý hoặc đá quý và ứng dụng đường ray song song.

Tuy nhiên, xin lưu ý rằng điều này chỉ hoạt động khi bạn đang sử dụng git cho sự phụ thuộc của mình, ví dụ:

# In Gemfile
gem 'rack', :github => 'rack/rack', :branch => 'master'

# In your terminal
$ bundle config local.rack ~/Work/git/rack

Như đã thấy trên các tài liệu .


Tôi gặp vấn đề với điều này bởi vì tôi đang sử dụng BUNDLE_PATH(xây dựng một gói để phân phối). Khi thực hiện những gì bạn đề xuất hoặc câu trả lời của Jimmy, nó chỉ thực hiện usingvà không thực sự cài đặt vào BUNDLE_PATHthư mục của tôi . Tôi đã không thể tìm ra điều này, bất kỳ trợ giúp?
Automatico

2
Lưu ý điều này sẽ không hoạt động với gempec , mỗi cuộc thảo luận ở đây .
davetapley

31
Để vô hiệu hóa ghi đè cục bộ:bundle config --delete local.GEM_NAME
alxndr

Tôi đã phải xóa chỉ thị phiên bản khỏi dòng đá quý để làm việc này.
Epigene

4
Nếu bạn muốn sử dụng một nhánh khác trong phát triển từ sản xuất, bạn cũng phải đặt bundle config disable_local_branch_check truehoặc Bundler sẽ phàn nàn về chi nhánh đó. Hãy cẩn thận với điều này, vì các kiểm tra được cho là để ngăn chặn các cam kết không chính xác đi vào Gemfile.lock. Tài liệu ở đây: bundler.io/v1.12/git.html
Leo

33

Bạn cũng có thể tham chiếu một viên ngọc địa phương với git nếu bạn tình cờ làm việc với nó.

gem 'foo',
  :git => '/Path/to/local/git/repo',
  :branch => 'my-feature-branch'

Sau đó, nếu nó thay đổi, tôi chạy

bundle exec gem uninstall foo
bundle update foo

Nhưng tôi không chắc ai cũng cần chạy hai bước này.


5
Điều này thật tuyệt, nhưng sẽ không thuận tiện nếu bạn tích cực phát triển đá quý ... bởi vì bạn sẽ cần phải thực hiện mọi thay đổi & bundle uninstall <gem> && bundle install , cho mọi thay đổi bạn muốn được phản ánh trên ứng dụng của mình
Ramkes

18

Để sử dụng kho đá quý cục bộ trong dự án Rails, hãy làm theo các bước dưới đây:

  1. Kiểm tra xem thư mục gem của bạn có phải là kho lưu trữ git không (lệnh được thực thi trong thư mục gem)

    git rev-parse --is-inside-work-tree
  2. Bắt đường dẫn kho lưu trữ (lệnh được thực thi trong thư mục gem)

    git rev-parse --show-toplevel
  3. Thiết lập ghi đè cục bộ cho ứng dụng đường ray

    bundle config local.GEM_NAME /path/to/local/git/repository

    nơi GEM_NAMElà tên của đá quý của bạn và /path/to/local/git/repositorylà sản phẩm của các lệnh trong điểm2

  4. Trong ứng dụng của bạn Gemfilethêm dòng sau:

    gem 'GEM_NAME', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'
  5. Chạy bundle installnên cho một cái gì đó như thế này:

    Using GEM_NAME (0.0.1) from git://github.com/GEM_NAME/GEM_NAME.git (at /path/to/local/git/repository) 

    nơi GEM_NAMElà tên của đá quý của bạn và /path/to/local/git/repositorytừ điểm2

  6. Cuối cùng, chạy bundle list, không gem listvà bạn sẽ thấy một cái gì đó như thế này:

    GEM_NAME (0.0.1 5a68b88)

    nơi GEM_NAMElà tên của đá quý của bạn


Một vài trường hợp quan trọng tôi đang quan sát bằng cách sử dụng:

Rails 4.0.2  
ruby 2.0.0p247 (2013-06-27 revision 41674) [x86_64-linux] 
Ubuntu 13.10  
RubyMine 6.0.3
  • Có vẻ như RubyMinekhông hiển thị đá quý địa phương như một thư viện bên ngoài. Thông tin thêm về lỗi có thể được tìm thấy ở đâyđây
  • Khi tôi thay đổi thứ gì đó trong đá quý cục bộ, để được tải trong ứng dụng rails, tôi nên sử dụng stop/startmáy chủ rails
  • Nếu tôi thay đổi versionviên ngọc, stopping/startingmáy chủ Rails sẽ báo lỗi cho tôi. Để khắc phục, tôi chỉ định phiên bản đá quý trong ứng dụng rails Gemfilenhư thế này:

    gem 'GEM_NAME', '0.0.2', :github => 'GEM_NAME/GEM_NAME', :branch => 'master'

0

Bạn có thể tham khảo đá quý với nguồn: source: 'https://source.com', git repository (:github => 'git/url')và với đường dẫn cục bộ :path => '.../path/gem_name'.
Bạn có thể tìm hiểu thêm về Gemfiles và cách sử dụng chúng trong bài viết này.


-4

Nếu bạn muốn chi nhánh quá:

gem 'foo', path: "point/to/your/path", branch: "branch-name"

Điều này không hoạt động, tạo ra một lỗi: Only gems with a git source can specify a branch.
KenB
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.