【问题标题】:How can I correctly deploy static and compiled assets in rails with nginx and capistrano?如何使用 nginx 和 capistrano 在 Rails 中正确部署静态和编译资产?
【发布时间】:2013-02-07 20:29:36
【问题描述】:

在我的项目中,我尝试将我的大部分 js 库捆绑到 gems 中,以便可以在必要时更新和拉入它们,但是,我最近设置了我们的生产服务器,但在资产编译和/public/assets 中的静态资产。

具体来说,当我不使用资产管道时,我对尝试使用的数据表或任何其他 JS 库或 css 没有任何问题。我正在生产环境中预编译我的资产,并使用典型的 nginx 设置(基于 railscast #335)为它们提供服务。

静态资产如下-

公共/资产

javascript/jquery.formatCurrency-1.4.0.min.js
stylesheets/datepicker.css
twitter/bootstrap/bootstrap-datepicker.js

public/assets 是存放这些的正确位置吗?

当我使用 capistrano 进行部署时,这些资产在加载页面时会得到 404,并且实际上并未复制到服务器上的 /public/assets 目录。

在加载其他页面时,我按如下方式调用数据表插件

$('#inventory_item_list_datatable').dataTable
  sDom: "<'row'<'span6'l><'span6'f>r>t<'row'<'span6'i><'span6'p>>",
  sPaginationType: "bootstrap",
  iDisplayLength: 100

Datatables 被编译到我的 application.js 中并且不会引发错误,但该表从未真正呈现。我想知道这是否与编译所有内容的顺序有关?

app/assets/javascripts/application.js

//= require jquery
//= require jquery_ujs
//= require jquery_nested_form
//= require twitter/bootstrap
//= require dataTables/jquery.dataTables
//= require dataTables/jquery.dataTables.bootstrap
//= require_tree .

app/views/layouts/application.html.erb

<%= stylesheet_link_tag    "application", :media => "all" %>
<link href="/assets/stylesheets/datepicker.css" media="all" rel="stylesheet" type="text/css" />

<%= javascript_include_tag "application" %>
<script src="/assets/twitter/bootstrap/bootstrap-datepicker.js" type="text/javascript"></script>

---编辑数据表问题

当使用 jquery-datatables-rails gem 时,它必须在 gemfile 中的资产组之外。

【问题讨论】:

  • 当你说你正在预编译资产时,你是在本地做的吗?如果是这样,您是否有实际将这些文件同步到生产服务器的 capistrano 任务?它们是您存储库的一部分吗?如果你去你服务器上的public/assets目录,里面有什么吗?
  • 我正在使用 capistrano 预编译服务器上的资产。 load 'deploy/assets' 除了我在 public/assets 目录中的本地文件之外,所有样式和其他所有内容都在那里。
  • 那么您在顶部描述的资产(formatCurrency、datepicker、bootstrap-datepicker)在您的public/assets 目录中并且没有通过管道加载?如果是这种情况,我假设您忽略了存储库中的 public/assets。您可能应该将它们粘贴在vendor/assets 中,通过管道加载它们,然后在预编译发生时将它们放入public/assets
  • 我的仓库不会忽略 /public/assets。供应商/资产是否可以接受这些?本地 public/assets 目录将用于什么?
  • 是的。如果您包含“不是您的”的资产,例如 css/js/images(如果您知道我的意思),那么是的,vendor/assets 是这些资产的可接受位置。

标签: ruby-on-rails ruby-on-rails-3.2 asset-pipeline rvm-capistrano


【解决方案1】:

默认情况下,asset-pipeline 带有 3 个放置资源的位置:app/assetslib/assetsvendor/assets。您必须将您的资产放在那里(如果您想依赖管道),而不是在 public/ 中。在生产环境中,所有资产都被压缩并转换为一个文件(分别为.js.css):application.*

编辑:在这种情况下,assets 目录的结构不同。在与@theIV 和@Kosmonaut 聊天后,我们找到了解决方案:将资产移动到vendor/assets 目录结构:

对于 Javascript 资产:

 vendor/assets/javascripts/specific_javasripts

对于 CSS:

vendor/assets/stylesheets/specific_stylesheets

默认情况下,vendor/assets/ 目录不包含javascriptsstylesheets 目录,它们应该被创建。

【讨论】:

    猜你喜欢
    • 2014-06-14
    • 1970-01-01
    • 2013-11-04
    • 2012-02-19
    • 1970-01-01
    • 2013-04-29
    • 2014-02-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多