Исключить *.spec.js файлы в конвейере ресурсов Rails (application.js)

Я пытаюсь следовать за John Papa AngularJs 1.x styleguide (организация тестов) и размещать *.spec.js файлы (которые будут выполняться с использованием Karma) рядом с клиентом кода, в результате чего файлы, такие как some.filter.js и some.filter.spec.js, располагаются рядом друг с другом.

Однако мне нужно избегать, включая файлы *.spec.js в конвейере активов.

Единственные параметры, которые я вижу сейчас, либо избегают использования //= require_tree . в файле application.js и явно указывать каждый отдельный файл, либо отказываться от хранения файлов спецификаций рядом с кодом.

Есть ли лучший способ достижения желаемого поведения?

(Я использую звездочки 3.5.2 и рельсы 4.2.6)

Ответ 1

Обратите внимание: этот ответ основан на defsprite one, потому что он указал мне в правильном направлении, но реальность оказалась немного более жесткой.

Поместите следующее в config/initializers/sprockets.rb, чтобы зарегистрировать новый процессор звездочек:

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

Наиболее заметные изменения в отношении исходного ответа включают преобразование абсолютных путей, возвращаемых Dir в относительные (абсолютные пути не принимаются звездочками) и другой метод регистрации (Rails.application.assets есть nil в моем случае).

Затем в application.js (перед любыми require_tree операторами) добавьте:

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

Ответ 2

Сам звездочки не реализует флешинг файлов (пока) - это может быть достигнуто только путем предоставления пользовательского DirectiveProcessor. К счастью, уже есть драгоценный камень, обеспечивающий именно то, что вы хотите: https://github.com/backupify/sprockets-glob

Из документации:

# 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