2016-03-07 16 views
6

Chúng tôi có a gem chạy qua tác vụ Rake. Nhiệm vụ được xác định trong lib/tasks/<namespace>.rake. Sau khi đọc Rake tasks inside gem not being found Tôi xác nhận rằng .gemspec bao gồm tệp xác định tác vụ; cũng có a railtie which should be including the tasks như được đề xuất trong including rake tasks in gems. Và ứng dụng Rails 4.1 của chúng tôi dường như không tải nhiệm vụ Rake.Tại sao đá quý này không thêm tác vụ rake vào ứng dụng Rails?

Tôi đang thiếu gì?

Trả lời

3

Vấn đề không phải với đá quý, nhưng với cách nó được đưa vào ứng dụng.

Trong Gemfile, công trình này và bao gồm các nhiệm vụ rake:

gem 'gem_fresh' 

này hoạt động nhưng không bao gồm các nhiệm vụ rake:

group :development do 
    gem 'gem_fresh' 
end 

này có vẻ là do cách Bundler yêu cầu đá quý trong ứng dụng Rails. From the documentation:

Theo mặc định, ứng dụng tạo Rails gọi Bundler.require(:default, Rails.env) trong ứng dụng của bạn.rb, liên kết các nhóm trong môi trường Gemfile với môi trường Rails.

Nếu vì một lý do nào đó Rails.env tranh luận đã không được đánh giá bao gồm các nhóm :development, mà dường như là trường hợp khi tôi gọi rake -T, viên ngọc sẽ không Bundler.require -d, và các nhiệm vụ cào wouldn' t được tải.

Thực tế là nó không bao gồm nhóm :development dường như là một Bundler lẻ "gotcha", nhưng ít nhất bây giờ tôi biết rằng di chuyển nó vào nhóm mặc định giải quyết vấn đề và nó không phải là một vấn đề với đá quý.

3

Tôi đã thử nghiệm chỉ thành công đá quý của bạn và tôi có thể thấy không có vấn đề với các nhiệm vụ cào trong nó:

  • tôi thêm gem_fresh đến Gemfile và chạy bundle, viên ngọc cài đặt
  • Ngay lập tức tôi có thể nhìn thấy rake có mặt trong danh sách cào:

    $ rake -T outdated 
    rake gem_fresh:outdated # outdated 
    
  • Sau đó, tôi được cập nhật các railtie.rb tập tin để sử dụng.210 phương pháp để nạp cào quy định tại lib/task/metrics.rake và tìm kiếm sự cào có sẵn một lần nữa:

    # lib/gem_fresh/railtie.rb: 
    rake_tasks do 
        namespace :gem_fresh do 
        desc "outdated" 
        task :outdated => :environment do 
         GemFresh::Reporter.new.report 
        end 
        end 
    
        load "tasks/metrics.rake" 
    end 
    
    $ rake -T outdated 
    rake gem_fresh:outdated  # outdated 
    rake metrics:outdated_gems # display outdated gem version metrics 
    

Vì vậy, tôi có thể thấy không có vấn đề với đá quý của bạn. Cả hai phương thức trong railtie (inline rake cũng như sử dụng phương thức load) dường như hoạt động OK. Sự khác biệt duy nhất tôi nhận thấy là tôi đã thử nghiệm điều này trên đường ray 4.2 nhưng tôi khá nghi ngờ rằng sẽ tạo sự khác biệt.

Bạn đã đặt viên ngọc vào Gemfile của mình chưa? Nếu tôi gỡ bỏ nó từ đó, tôi thực sự thấy không có gem_fresh rakes được xác định.

+1

Bạn đã dẫn tôi đến câu trả lời! – pjmorse

-1

ok

gem_fresh được bao gồm trong .gemspec nhưng nó phải được thiếu từ Gemfile

Thats là nguyên nhân của vấn đề xảy ra. bạn có thể xác minh nó không.

Các vấn đề liên quan