未在ec2实例上的生产中提供未在公共/包装中使用rails预编译的资产

我正在使用Capistrano在具有Nginx的AWS ec2实例上通过webpacker部署Rails 6应用程序。第一次在生产环境中部署该应用程序时,我这样做是在本地不进行资产预编译的情况下,花费的时间太长,终于可以工作了。但是随着我的应用程序变得越来越庞大,需要编译许多CSS,JS和其他资源,我继续使用RAILS_ENV=production bundle exec rails assets:precompile在本地进行预编译。然后,我使用SKIP_ASSETS=1 cap production deploy部署到生产环境,其中SKIP_ASSETS是capistrano / task文件夹中的rake任务。我能够更快地部署应用程序,而无需在生产服务器上编译资产。当我刷新浏览器时,可以看到我的应用程序,但是没有提供在public / packs文件夹中预编译的资产(.css和.js文件的哈希值与public / packs中的哈希值不匹配。

我在浏览器控制台上看到以下错误

GET https://somedomain.net/packs/css/application-e1eaaa01.css net::ERR_ABORTED 404 (Not Found)
GET https://somedomain.net/packs/js/application-a89fd481878017456cf7.js net::ERR_ABORTED 404 (Not Found)

这是我在public / packs / css /

的生产环境中看到的内容
application-91e4cb67.css  application-91e4cb67.css.br  application-91e4cb67.css.gz

在生产日志中,我发现了

FATAL -- : [2c61c3a9-0133-4eda-b37b-4fefe8948ec0]   
[2c61c3a9-0133-4eda-b37b-4fefe8948ec0] actionController::RoutingError (No route matches [GET] "/packs/js/application-a89fd481878017456cf7.js"):

看着nginx.conf我有这行

root /home/deploy/myapp/current/public

我也尝试在production.rb中进行设置,但这并不能解决问题

config.public_file_server.enabled=true

public / packs / manifest.json看起来像这样:

{
  "admin.js": "/packs/js/admin-3adbcf597c3892508a80.js","admin.js.map": "/packs/js/admin-3adbcf597c3892508a80.js.map","app.js": "/packs/js/app-aedc421c2c4342e69b23.js","app.js.map": "/packs/js/app-aedc421c2c4342e69b23.js.map","application.css": "/packs/css/application-e1eaaa01.css","application.css.map": "/packs/css/application-e1eaaa01.css.map","application.js": "/packs/js/application-a89fd481878017456cf7.js","application.js.map": "/packs/js/application-a89fd481878017456cf7.js.map","curriculum.js": "/packs/js/curriculum-90932b11d8e738537011.js","curriculum.js.map": "/packs/js/curriculum-90932b11d8e738537011.js.map","entrypoints": {
    "admin": {
      "js": [
        "/packs/js/admin-3adbcf597c3892508a80.js"
      ],"js.map": [
        "/packs/js/admin-3adbcf597c3892508a80.js.map"
      ]
    },"app": {
      "js": [
        "/packs/js/app-aedc421c2c4342e69b23.js"
      ],"js.map": [
        "/packs/js/app-aedc421c2c4342e69b23.js.map"
      ]
    },"application": {
      "css": [
        "/packs/css/application-e1eaaa01.css"
      ],"js": [
        "/packs/js/application-a89fd481878017456cf7.js"
      ],"css.map": [
        "/packs/css/application-e1eaaa01.css.map"
      ],"js.map": [
        "/packs/js/application-a89fd481878017456cf7.js.map"
      ]
    },"curriculum": {
      "js": [
        "/packs/js/curriculum-90932b11d8e738537011.js"
      ],"js.map": [
        "/packs/js/curriculum-90932b11d8e738537011.js.map"
      ]
    },"jquery-ui": {
      "js": [
        "/packs/js/jquery-ui-3e39ba39480cd149114d.js"
      ],"js.map": [
        "/packs/js/jquery-ui-3e39ba39480cd149114d.js.map"
      ]
    },"jquery": {
      "js": [
        "/packs/js/jquery-9e6aaa895e0224ac507d.js"
      ],"js.map": [
        "/packs/js/jquery-9e6aaa895e0224ac507d.js.map"
      ]
    },"quill_editor": {
      "js": [
        "/packs/js/quill_editor-9b402f092ddc5d16a887.js"
      ],"js.map": [
        "/packs/js/quill_editor-9b402f092ddc5d16a887.js.map"
      ]
    },"shared_javascript": {
      "js": [
        "/packs/js/shared_javascript-f0cae6e551b8cfc573c9.js"
      ],"js.map": [
        "/packs/js/shared_javascript-f0cae6e551b8cfc573c9.js.map"
      ]
    },"video_player": {
      "js": [
        "/packs/js/video_player-8b5df237b6fc7da9efea.js"
      ],"js.map": [
        "/packs/js/video_player-8b5df237b6fc7da9efea.js.map"
      ]
    }
  },"jquery-ui.js": "/packs/js/jquery-ui-3e39ba39480cd149114d.js","jquery-ui.js.map": "/packs/js/jquery-ui-3e39ba39480cd149114d.js.map","jquery.js": "/packs/js/jquery-9e6aaa895e0224ac507d.js","jquery.js.map": "/packs/js/jquery-9e6aaa895e0224ac507d.js.map","quill_editor.js": "/packs/js/quill_editor-9b402f092ddc5d16a887.js","quill_editor.js.map": "/packs/js/quill_editor-9b402f092ddc5d16a887.js.map","shared_javascript.js": "/packs/js/shared_javascript-f0cae6e551b8cfc573c9.js","shared_javascript.js.map": "/packs/js/shared_javascript-f0cae6e551b8cfc573c9.js.map","video_player.js": "/packs/js/video_player-8b5df237b6fc7da9efea.js","video_player.js.map": "/packs/js/video_player-8b5df237b6fc7da9efea.js.map"
}

我感觉到没有用新的预编译的.css和.js资产哈希值进行更新的感觉。

有什么想法可以解决生产中的这个问题吗?我是否需要在生产中运行特定的webpacker命令来解决此问题。谢谢

huozong 回答:未在ec2实例上的生产中提供未在公共/包装中使用rails预编译的资产

经过数小时的搜索,在其他地方提出问题并进行实验后,我终于想到了一个解决方案,该方案是激进的但对我有用:我删除了服务器上的currentreleases文件夹,然后运行我的本地计算机上的asset:clean,assets:clobber,然后在config.assets.compile = false中设置environement/production.rb,在packs中将output_path从public/assets更改为webpacker.yml。然后,我再次在本地进行预编译,然后进行部署。我跳过了再次在服务器上进行资产编译的过程,它可以正常工作!。

本文链接:https://www.f2er.com/2583207.html

大家都在问