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.
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.
Câu trả lời:
Đ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.
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).
gemspec
và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.
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.
gem 'my_gem', git: 'git@github.com:me/myrepo', submodules: true
trong ứng dụng máy chủ của bạn nếu bạn đang cài đặt từ github.
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 P
và bạn muốn sử dụng đá quý tự tạo tools
mà 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 oauth2
và 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 P
Gemfile của projet và đây sẽ là phiên bản được sử dụng tools
trong thời gian chạy:
gem 'oauth2', github: 'lgs/oauth2'