Я исправил! Были две проблемы:
- Файлы
bin
в общем каталоге - Не устанавливались пакеты
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
После того, как я добавил его, развертывание прошло гладко!