Компиляция активов ищет неправильный путь для файлов конфигурации Webpacker - PullRequest
0 голосов
/ 05 августа 2020

Я добавил гем webpacker в свое приложение Rails 5.2, и теперь я пытаюсь развернуть его на сервере с Capistrano. Процесс завершается ошибкой на этапе deploy:assets:precompile со следующим сообщением об ошибке:

DEBUG [f2c62805] Command: cd /var/www/myapp/releases/20200805023716 && ( export RAILS_ENV="production" RAILS_GROUPS="" ; /usr/local/rvm/bin/rvm 2.5.7 do bundle exec rake assets:precompile )

 DEBUG [f2c62805]       Compiling...

 DEBUG [f2c62805]       Compilation failed:

webpack config /var/www/myapp/shared/config/webpack/production.js not found, please run 'bundle exec rails webpacker:install' to install Webpacker with default configs or add the missing config file for your custom environment.

Я не знаю, почему он ищет в папке shared/config, а не в папке новой версии. Предположительно, я бы не хотел, чтобы моя конфигурация была передана в общий доступ, если я изменю ее и будущее развертывание не удастся. В этом случае текущая версия моего приложения будет иметь конфигурацию, которая может не подходить для нее.

Вот некоторые из соответствующих конфигураций Capistrano:

set :config_files, ['config/boot.rb', 'config/database.yml', 'config/secrets.yml']
set :bin_files, ['bin/bundle', 'bin/delayed_job', 'bin/rails', 'bin/rake', 'bin/webpack']

# Tells Capistrano to store config/database.yml file inside a directory called /shared, which is meant for any files
# we want to persist between deploys
set :linked_files, fetch(:linked_files, []) + fetch(:config_files)

# Directories that are meant to persist between deploys, and they will also be stored inside /shared
set :linked_dirs, fetch(:linked_dirs, []).push('bin', 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

Ресурсы звездочек скомпилированы отлично . Я пробовал запустить bundle exec rake assets:precompile на сервере, и он действительно выглядит в папке shared/config. Я запустил --trace и обнаружил, что при этом выполняется шаг webpacker:compile, на котором он терпит неудачу.

Что я могу сделать, чтобы заставить его искать файл конфигурации в каталоге текущего выпуска (/var/www/myapp/releases/20200805023716/config/webpack/production.js)?

1 Ответ

0 голосов
/ 05 августа 2020

Я исправил! Были две проблемы:

  1. Файлы bin в общем каталоге
  2. Не устанавливались пакеты yarn перед предварительной компиляцией ресурсов

Проблема № 1 : Файлы bin в общем каталоге

Я ранее настроил развертывание для копирования файлов bin в каталог shared, чтобы можно было запустить delayed_job. При загрузке файлов эти файлы автоматически становятся исполняемыми. До сих пор это не было проблемой. Но это проблема при компиляции ресурсов веб-пакета из-за этой строки в процессе компиляции Webpacker :

stdout, stderr, status = Open3.capture3(
  webpack_env,
  "#{RbConfig.ruby} ./bin/webpack",
  chdir: File.expand_path(config.root_path)
)

Поскольку я переместил все свои файлы bin в каталог shared и Capistrano установить символическую ссылку, он запустит файл bin/webpack в общем каталоге. Когда эта команда запускается, она ищет относительные пути к файлам конфигурации Webpacker. Учитывая контекст, это означает, что он будет искать мои файлы конфигурации веб-пакета в /var/www/myapp/shared/config/webpack/production.js вместо /var/www/myapp/releases/20200805023716/config/webpack/production.js.

Решение: прекратить копирование bin файлов в каталог shared и установить их как исполняемые

Чтобы исправить это, я удалил эту строку из сценария развертывания Capistrano:

# config/deploy.rb
set :bin_files, ['bin/bundle', 'bin/delayed_job', 'bin/rails', 'bin/rake', 'bin/webpack']

Затем я удалил bin из моих связанных каталогов:

# config/deploy.rb
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

После при этом Webpacker будет искать в правильном каталоге при предварительной компиляции ресурсов. Теперь мне нужно было исправить проблему с исполняемым файлом. Я добавил новую задачу Capistrano, которую нашел в этом SO-ответе :

before "deploy:symlink:release", "deploy:ensure_bin_files_executable"

namespace :deploy do
  desc 'Ensure that bin files are executable'
  task :ensure_bin_files_executable do
    on roles(:web) do
      within release_path do
        execute "cd #{release_path} && chmod +x bin/*"
      end
    end
  end
end

Это сделало все файлы в папке bin/ исполняемыми. Проблема решена!

Проблема № 2: Не устанавливаются пакеты yarn перед предварительной компиляцией ресурсов

После решения первой проблемы я получил эту ошибку при предварительной компиляции ресурсов:

01:33 deploy:assets:precompile
  01 /usr/local/rvm/bin/rvm default do bundle exec rake assets:precompile
  01 Webpacker is installed ? ?
  01 Using /var/www/myapp/releases/20200805023716/config/webpacker.yml file for setting up webpack paths
  01 Compiling…
  01 Compilation failed:
  01 yarn run v1.13.0
  01 info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.
  01
  01 warning package.json: No license field
  01 error Command "webpack" not found.
Решение: установите пакеты yarn перед предварительной компиляцией ресурсов

Я понял, что Yarn не установил пакет webpack, поэтому я нашел эту полезную задачу Capistrano в документе о развертывании Webpacker :

Убедитесь, что у вас есть public / packs и node_modules в: connected_dirs

append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "public/packs", ".bundle", "node_modules"

Если у вас есть node_modules, добавленные в: connected_dirs, вам необходимо запустить yarn install перед развертыванием: assets: precompile, поэтому вы можете добавить этот фрагмент кода внизу deploy.rb

before "deploy:assets:precompile", "deploy:yarn_install"

namespace :deploy do
  desc "Run rake yarn install"
  task :yarn_install do
    on roles(:web) do
      within release_path do
        execute("cd #{release_path} && yarn install --silent --no-progress --no-audit --no-optional")
      end
    end
  end
end

После того, как я добавил его, развертывание прошло гладко!

...