Подтвердить что ты не робот

Как избежать использования предварительно скомпилированных активов в режиме разработки?

Я предпочитаю не конкатенировать файлы JavaScript в режиме разработки, а обслуживать их как отдельные файлы. Поэтому я настроил:

development.rb:

config.assets.compress = false
config.assets.debug = true
config.assets.compile = true

В каталоге my/app/assets/javascript у меня есть:

  • reviews.js
  • обзоры /
    • foo.js
    • bar.js

reviews.js:

//= require jquery
//= require jquery_ujs
//= require_tree ./reviews

Я включаю JavaScript, используя <%= javascript_include_tag "reviews" %> в своем макете. Сгенерированная страница правильно ссылается на три сценария отдельно, а reviews.js по существу пуст. Пока все хорошо.

Теперь, когда я прекомпилирую свои активы для производства с помощью rake assets:precompile, три файла JavaScript объединяются в reviews.js. Это нормально для производства, но теперь в режиме разработки конкатенированный reviews.js служит дополнительно для двух отдельных файлов.

Конечно, это приводит ко всем видам неприятных ошибок при разработке, потому что теперь содержимое foo.js и bar.js выполняется дважды, один из них в потенциально более ранней версии в reviews.js.

Как я могу убедиться, что Rails не использует предварительно скомпилированные активы в режиме разработки?

4b9b3361

Ответ 1

Похоже, что вы предварительно компилируете локально. Поскольку файлы существуют в ожидаемом местоположении, они обслуживаются вашим dev-сервером, и запросы не идут в Sprockets.

Единственный способ остановить это - удалить скомпилированные файлы.

Обычно вам не нужно компилировать локально. Ожидается, что почти во всех случаях задача прекомпиляции будет выполняться во время развертывания приложения. Существует рецепт Capistrano для этого на странице руководства по конвейеру активов.

Если вам нужно, чтобы эти файлы были локально привязаны к вашему репо, вы можете использовать ветку, чтобы избежать проблемы. Зарезервируйте основную ветку для производственного кода и создайте вторую ветку для dev. Только компилируйте и передайте активы на master. Когда вы переключитесь на dev, они исчезнут. При необходимости объедините dev в master.

Изменить: убедитесь, что вы заставляете браузер обновляться (control + F5), или вы можете найти старые активы, используемые в кеше браузера!

Ответ 2

В config/environments/development.rb установите:

config.assets.prefix = "/assets_dev"

так что в режиме разработки Rails будет выглядеть там (но он ничего не найдет, поскольку вы не будете компилировать активы в разработке (это действительно то, что вы пытаетесь сделать, а не компилировать активы)).

При предварительной компиляции для производства используйте

RAILS_ENV=production rake assets:precompile

поэтому он компилируется в папку по умолчанию, public/assets.

Ответ 3

в config/environments/development.rb установить:

config.serve_static_assets = false

и никакие файлы из /public не будут обслуживаться

Ответ 4

Я пробовал это, и это сработало. rake assets:precompile RAILS_ENV=production

Я заметил, что новая версия конвейера активов делает это, когда вы запускаете rake assets:precompile делает rake assets:precompile:all