【问题标题】:config.assets.precompile - include a folder of files? or kill the precompile 'feature' entirely?config.assets.precompile - 包含一个文件夹?或完全杀死预编译“功能”?
【发布时间】:2013-08-15 15:10:08
【问题描述】:

我已在此处阅读并尝试了 Assets Pipeline 指南: http://guides.rubyonrails.org/asset_pipeline.html

... 它显示了如何在手动创建和更新的列表中包含特定文件,--或-- Proc 包含一个(或多个目录)但随后排除了 Rails 通常包含的所有其他文件。

我想将我的文件文件夹 += 到通常包含的文件中。

我已经尝试了答案:

Rails config.assets.precompile setting to process all CSS and JS files in app/assets

What is the purpose of config.assets.precompile?

rails config.assets.precompile for specific sub folder

...最后一个似乎显示了解决方案:

config.assets.precompile += ["*external/calendars*"]

我改成了:

    config.assets.precompile += %w["*javascript*"]

或 config.assets.precompile += ["javascript"] (以及大约 20 种其他变体。)

... 获取我的 assets/javascript 文件夹。但该目录不包括在内,由错误“...未预编译”证明。

第三种方法,就是给它

 config.assets.precompile += %w( *.js )

...这可行,但会导致编译非常非常长,我假设可以在任何地方找到它可以发现的每个 JS 文件。

不用说,将文件添加到手动更新的列表不适合正在进行的应用程序 - 并且丢失任何未知的东西 Rails 使用排除性 Proc 预编译也不会削减它(但这是仅有的两个示例文档)。

“+-=”文件夹没有简单的通配符解决方案 - 或者只是关闭这个“功能”,为每个视图指定我的 JS,并且仍然可以在 Heroku 上运行?

----EDIT - 我越看越不合理。 本质上,解决方案是“加载 Rails 在开发模式下发现 A-OK 的所有内容”。然而这样的选择还不存在?

production.rb 文件,指的是预编译行,说:

  # Precompile additional assets (application.js, application.css, and all non-JS/CSS are already added)

...而 application.js 有:

//= require_tree .

... 所以应该加载该目录下的所有文件 - 但它没有。为什么?我挖掘得越深,它的意义就越小。

【问题讨论】:

    标签: ruby-on-rails-3 heroku


    【解决方案1】:

    在处理要添加到资产管道的多个 CSS/JS 文件时,一个好的做法是简单地为这些文件创建一个新清单:

    假设您在lib/assets/javascripts/external/calendars 下有一些 JS 文件,并且您想通过资产管道加载它们。

    您想创建一个包含以下内容的 index.js 清单文件:

    // This is a manifest file that'll be compiled into application.js, which will include all the files
    // listed below.
    //
    // Any JavaScript/Coffee file within this directory, lib/assets/javascripts, vendor/assets/javascripts,
    // or vendor/assets/javascripts of plugins, if any, can be referenced here using a relative path.
    //
    // It's not advisable to add code directly here, but if you do, it'll appear at the bottom of the
    // the compiled file.
    //
    // WARNING: THE FIRST BLANK LINE MARKS THE END OF WHAT'S TO BE PROCESSED, ANY BLANK LINE SHOULD
    // GO AFTER THE REQUIRES BELOW.
    //
    //= require_tree .
    

    由于require_tree . 指令,默认情况下,您添加到external/calendars 目录中的所有JS 文件都将包含在内。

    现在,在您的 app/assets/javascripts/application.js 文件中添加以下行:

    //= require calendars
    

    这应该会找到您的“日历清单索引文件”并加载所有相关的 JS 文件。无需在资产管道中添加任何东西,它就可以工作。

    【讨论】:

    • 我只是想将文件包含在 app/assets/javascripts/ 中——此时没有子目录。我将“index.js”文件添加到“app/assets/javascripts/”文件夹中(这是正确的位置吗?),并将“//= require javascripts”放入“app/assets/javascripts/application.js”文件。我还注释掉了“production.rb”文件中的“config.assets.precompile”行。现在,当我运行 'bundle exec rake assets:precompile' 时,我收到错误“找不到文件 'javascripts'”。
    • 好的,我看到必须使用子目录才能使此方法起作用。我创建了一个,将文件放在那里,然后预编译创建了 /public/assets/blah 文件。请注意,一个人的 JS 文件包含在缩小的 application.js 文件中 - 不是在他们自己的 js 文件中,因为他们使用了其他一些方法。不幸的是,当我推送到 Heroku 时,文件仍然无法正常工作 - “blah.js 未预编译”错误 - 尽管在 x 秒内预编译 slug 时没有错误。
    • 在 production.rb 中添加了 config.assets.precompile 行 as+= %w( index.js )
    • 同样的错误...啊,因为该文件在视图中被引用,现在它不再作为自己的文件存在,而是混入了application.js - sigh。是时候重新修改我的所有视图以删除对我的独立 js 文件的任何引用。这样做是为了一对夫妇进行测试,他们现在可以工作了。感谢皮埃尔指向正确的方向。
    • 欢迎您 :) 很高兴它对您有所帮助。使用资产管道并不容易:(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多