2016-03-10 17 views
11

Tôi đang cố gắng tuân theo Johnular's AngularJs 1.x styleguide (organising tests) và đặt các tệp *.spec.js (được thực thi bằng cách sử dụng Karma) bên cạnh mã máy khách , kết quả là các tệp như some.filter.jssome.filter.spec.js được đặt cạnh nhau.Loại trừ các tệp * .spec.js trong đường dẫn nội dung Rails (application.js)

Tuy nhiên, những gì tôi cần tránh, bao gồm các tệp *.spec.js trong đường dẫn nội dung.

Tùy chọn duy nhất tôi thấy bây giờ là tránh sử dụng //= require_tree . trong tệp application.js và chỉ định từng tệp một cách rõ ràng hoặc từ bỏ việc lưu các tệp thông số bên cạnh mã.

Có cách nào tốt hơn để đạt được hành vi mong muốn không?

(Tôi đang sử dụng sprockets 3.5.2 và 4.2.6 ray)

Trả lời

1

Xin lưu ý: câu trả lời này được dựa trên defsprite's one, bởi vì nó chỉ cho tôi đi đúng hướng, nhưng thực tế hóa ra là một chút khắc nghiệt hơn.

Đặt sau trong config/initializers/sprockets.rb đăng ký một bộ xử lý sprockets mới:

class DirectiveProcessor < Sprockets::DirectiveProcessor 
    def process_require_glob_directive(glob) 
    each_file(glob) { |fn| process_require_directive(fn) } 
    end 

    def process_stub_glob_directive(glob) 
    each_file(glob) { |fn| process_stub_directive(fn) } 
    end 

    private 

    def each_file(glob) 
    glob_pattern = "#{@dirname}/#{glob}" 
    path_prefix = Pathname.new(@dirname) 

    Dir[glob_pattern].sort.each do |path| 
     yield Pathname.new(path).relative_path_from(path_prefix).to_s 
    end 
    end 
end 

Rails.application.config.assets.configure do |env| 
    env.register_processor('application/javascript', DirectiveProcessor) 
end 

Những thay đổi đáng chú ý nhất liên quan đến câu trả lời ban đầu bao gồm chuyển đổi đường dẫn tuyệt đối được trả về bởi Dir cho những người tương đối (đường dẫn tuyệt đối không được chấp nhận bởi sprockets) và phương pháp đăng ký khác (Rails.application.assetsnil trong trường hợp của tôi).

Sau đó, trong application.js (trước khi bất kỳ require_tree báo cáo) của bạn thêm:

//= stub_glob angular/**/*.spec.js 
4

Bánh răng tự nó không thực hiện tập tin globbing (chưa) - điều này chỉ có thể đạt được bằng cách cung cấp một tùy chỉnh DirectiveProcessor. May mắn thay, đã có một viên ngọc cung cấp chính xác những gì bạn muốn: https://github.com/backupify/sprockets-glob

Từ các tài liệu:

# config/initializers/sprockets.rb 
require 'sprockets/glob' 
Rails.application.assets.register_processor('application/javascript', Sprockets::Glob::DirectiveProcessor) 

# application.js 
//= require_glob features/**/*.js 
//= stub_glob features/**/*test.js 
Các vấn đề liên quan