Ruby Gemspec Dependency: Có thể có một phụ thuộc nhánh git không?


82

Có thể có một phụ thuộc nhánh git, bên trong mygem.gemspec không?

Tôi đang nghĩ điều gì đó tương tự như sau:

gem.add_runtime_dependency 'oauth2', :git => 'git@github.com:lgs/oauth2.git'

... nhưng nó không hoạt động.


Tôi cũng gặp vấn đề này, ngoại trừ việc tôi muốn có một phụ thuộc đường dẫn, không phải phụ thuộc git. Không có cách nào để giải quyết vấn đề này? Có thể bằng cách dán một số mã Ruby hackish trong gemspec ở đâu đó?
Ajedi32

Câu trả lời:


44

Điều này là không thể và có thể sẽ không bao giờ xảy ra vì RubyGems sẽ khá nặng tay khi cho phép các nhà phát triển đá quý yêu cầu người dùng phải cài đặt hệ thống kiểm soát phiên bản cụ thể để truy cập đá quý. Đá quý nên được độc lập với số lượng phụ thuộc tối thiểu để mọi người có thể sử dụng chúng trong một loạt các ứng dụng nhất có thể.

Nếu bạn muốn làm điều này cho các dự án nội bộ của riêng mình, gợi ý của tôi là sử dụng Bundler hỗ trợ điều này khá tốt.


22
... vâng, nhưng làm thế nào tôi có thể làm điều đó?
Luca G. Soave

33
Nhưng điều gì sẽ xảy ra nếu viên ngọc của bạn sau đó được đưa vào một viên đá quý khác (ví dụ: foobar_gem)? Khi foobar_gem muốn giải quyết các phụ thuộc trong gem của bạn, nó sẽ không chỉ xuất hiện trong tệp gemspec?
ermzeit

7
Bạn đã bao giờ tìm thấy một giải pháp cho điều này Tôi có cùng một vấn đề?
msaspence

14
@eremzeit & msaspence - vì bạn có rất nhiều ủng hộ nên tôi cảm thấy buộc phải trả lời. Không có giải pháp cho điều này bởi vì bạn đang làm sai . Việc phụ thuộc vào kho git cho một ứng dụng duy nhất sử dụng Bundler là điều hoàn toàn sai, nếu một viên ngọc đã phát hành phụ thuộc vào GitHub hoặc bất kỳ kho mã nguồn nào khác là hoàn toàn sai. Nếu bạn đang phát hành một viên ngọc, tất cả các phụ thuộc của nó cũng phải được phát hành dưới dạng đá quý. Để tạo ra một gói chính thức chẳng hạn như một viên đá quý dựa trên mã nguồn chưa được phát hành là đặt xe hàng trước con ngựa. Vui lòng không cố gắng làm điều này .
gtd

23
@gtd Tạo một viên ngọc và giải phóng một viên ngọc trên rubygem là hai việc riêng biệt. Có thể một gem riêng tư chưa được công bố có các phụ thuộc riêng của nó. Điều đó có vẻ ổn đối với tôi. RubyGems dường như không phục vụ cho trường hợp sử dụng này, nhưng tôi không tin rằng điều này đang làm sai. Chỉ là không có nhiều thứ để hỗ trợ nó. Tôi có lầm không?
Stephen Crosby

13

BIÊN TẬP

Theo một người bình luận, điều này không còn đúng nữa. Thông tin trước đó được giữ lại cho bối cảnh lịch sử.

Việc sao chép tham chiếu đến một viên đá quý trong Gemfile và .gemspec bây giờ xuất hiện để đưa ra thông báo cảnh báo trong Bundler, vì vậy câu trả lời này dường như không còn đúng nữa.

Thông tin lỗi thời

Bài viết này của Yehuda Katz đã giải tỏa sự nhầm lẫn tương tự cho tôi. Nó nói rằng, chỉ để sử dụng trong phát triển, tốt nhất là thêm nội dung git vào gemfile, nhưng gói đó vẫn sẽ sử dụng thông tin phụ thuộc / phiên bản từ gemspec (có vẻ kỳ diệu đối với tôi, nhưng tôi tin tưởng Yehuda).


3
Điều đó có gì kỳ diệu? Bundler chỉ đọc từ Gemfile — ngoại trừ việc nếu bạn đặt gemspecvào đó, nó cũng đọc từ gemspec. Vì vậy, khi bạn chạy bundle install, tôi giả sử (nhưng chưa kiểm tra) rằng điều xảy ra là Bundler cài đặt đá quý được chỉ định trong Gemfile. Vì Bundler đã cài đặt nó rồi, nên gem đó có sẵn cho gem require, bất kể thực tế là nó không đến từ kho lưu trữ đá quý. Không có phép thuật, chỉ cần Bundler làm việc như bình thường.
Marnen Laibow-Koser

2
Việc sao chép tham chiếu đến một viên đá quý trong Gemfile và .gemspec giờ đây dường như đưa ra thông báo cảnh báo trong Bundler, vì vậy câu trả lời này dường như không còn đúng nữa ...
Andy Jones

7

Tôi chỉ đang cố gắng tìm ra vấn đề này. Và tôi vừa nghĩ ra giải pháp sau (mà tôi không chắc liệu bạn xuất bản gem của mình hay có quyền phân phối lại gem oauth2 đó).

Trong gem của bạn yêu cầu gem oauth2, hãy chạy điều này.

git submodule add git@github.com:lgs/oauth2.git lib/oauth2

Nếu bạn yêu cầu một nhánh khác với mặc định

cd lib/oauth2 && git checkout <branchname_or_ref>
cd .. && git add lib/oauth2
git commit -m "adding outh2 submodule"

Trong gemspec của bạn, hãy thêm cái này bên trên dòng phiên bản yêu cầu của bạn

$:.push File.expand_path('../lib/oauth2/lib', __FILE__)

Ngoài ra, bạn sẽ cần thêm tất cả các phụ thuộc thời gian chạy của gem oauth2 vào gemspec của mình. Tôi vẫn chưa tìm ra cách giải quyết vấn đề này.

Đây là những gì tôi đã làm và nó phù hợp với chúng tôi vì đá quý của chúng tôi được yêu cầu thông qua git vì vậy tôi không chắc liệu điều này có hiệu quả với một viên ngọc được xuất bản bằng rubygems hay không.


Thêm phần phụ thuộc làm mô-đun con là giải pháp chính xác nếu bạn đã tạo tác giả cho cả hai viên ngọc và cả hai đều đang trong quá trình phát triển tích cực.
Benjineer

Điều quan trọng là nếu bạn làm điều này, bạn có thể cần phải sử dụng: gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: truetrong ứng dụng máy chủ của bạn nếu bạn đang cài đặt từ github.
Joe Edgar

1

Tôi tìm thấy một công việc xung quanh khá thẳng về phía trước:

Giả sử bạn đang tham gia một dự án Pvà bạn muốn sử dụng đá quý tự tạo toolsmà bản thân nó sử dụng đá quý hệ điều hành oauth2.

Nếu bạn đã tạo một bản vá bên trong oauth2và cần bản vá đó trong đá quý của mình tools, bạn sẽ không thể khắc phục sự cố này trong đá quý theo câu trả lời được chấp nhận .

Tuy nhiên, bạn có thể nói rõ phiên bản bạn muốn trong PGemfile của projet và đây sẽ là phiên bản được sử dụng toolstrong thời gian chạy:

gem 'oauth2', github: 'lgs/oauth2'

Đây là một ví dụ thực tế của tôi.

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.