在Rails中是否可以为不同的环境提供不同的资产目录?

时间:2015-10-29 11:00:40

标签: ruby-on-rails angularjs ruby-on-rails-4 gulp

在执行资产预编译(rake assets:precompile)之前,我想将gulp个任务应用于我的JavaScript文件:

app/assets/javascripts/my_angular/directives/*.js
app/assets/javascripts/my_angular/controllers/*.js

因此,当我稍后运行rake assets:precompile时,它将选择已经处理过的gulp文件。

但对我来说问题是我不想简单地使用gulp输出文件覆盖现有的JS文件,因为我仍然需要原始的,未触及的文件以便于开发。

我想我需要有两个文件夹:

1)development_assets

2)production_assets(带有gulp输出的自动生成的文件夹)

Rails是否可以为不同的环境设置不同的资源目录?(开发,生产)。如果是 - 如何配置?

也许我的问题有另一种解决方案?没有两个单独的目录......我愿意接受建议。

1 个答案:

答案 0 :(得分:2)

config.assets.prefix = '/gulped-assets' config/environments/production.rb configure the assets path。如果您在/gulped-assets中执行此操作,它将适用于生产但不适用于开发,让您仍然可以在开发中使用原始文件。您需要确保部署过程在资产编译之前运行Gulp,或者在本地运行Gulp并在您的存储库中包含/assets

您还可以add a preprocessor到资产管道,这样您只需要一个.sass目录。您可以通过指定文件扩展名和处理程序,然后将扩展名添加到您希望以这种方式处理的所有文件,就像使用.erbmodule BangBang class Template < ::Tilt::Template def prepare # Do any initialization here end # Adds a "!" to original template. def evaluate(scope, locals, &block) "#{data}!" end end end 等一样。来自Rails例子,它看起来像这样:

# config/initializers/bang.rb
Sprockets.register_engine '.bang', BangBang::Template
.bang

然后,扩展程序中包含!的任何文件都会附加data。已经支持很多不同的任务了,所以也许你可以避免让Gulp支持Sprockets-only管道。根据您的Gulp任务,您甚至可以通过它们进行shell并运行<div class="product"> <input type="text" name="barrel"> <input type="text" name="barrel"> <input type="text" name="barrel"> <input type="text" name="barrel"> <a href="#" class="add-to-cart">Add to Cart</a> </div> <div class="product"> <input type="text" name="barrel"> <input type="text" name="barrel"> <input type="text" name="barrel"> <input type="text" name="barrel"> <a href="#" class="add-to-cart">Add to Cart</a> </div> 来构建混合管道。

或者,您可以转向另一个方向并使用仅限Gulp的管道替换Sprockets。有很多人这样做,我在这里写的任何东西都很长,只会复制他们的工作,所以看看gulp-rails-pipeline宝石,或者读一下Gulp - a modern approach to asset pipeline for Rails developers的另一个角度吧