2012-07-10 63 views

回答

5

短:你不能。

在預編譯的Rails穿過的application.js文件,合併所有進口到一個,這樣只是改變一個文件僅僅是不可能的,因爲在那裏繼續壓縮。做快速修復時,在開發過程中預編譯:(它不會做任何不application.js中引用的文件)

下一個:你不應該運行耙資產。只有在部署時(取決於你的耐心),任務運行5分鐘應該沒問題。

在開發過程中,您應該使用開發環境,因爲Rails將提供未合併和未精簡的資產,因此不需要進行資產預編譯。 如果您正在運行通過rails s這在Web服務器Rails的建立應該是默認的,但你可以使用顯式啓動Rails服務器:

rails s RAILS_ENV=development

資產如果仍然無法正常顯示或看到錯誤請確保您有config.assets.debug = true

+0

如何避免需要運行rake資產:預編譯? – Paul 2012-07-10 14:26:22

5

@Tigraine是部分正確。 Rails 3.1+資產旨在由Rails完全管理,默認爲所有資產將被編譯爲一個js和一個css資產。

無論其...

編譯到一個單一的資產依賴於使用由所述鏈輪寶石處理的資產清單(的application.js和application.css)的。默認情況下,這些清單包含一個require_tree指令,它是包含所有文件的指令。如果您刪除該指令,則需要做更多工作才能編譯您的資產。

如果你想建立獨立的資產,你可以設置在application.rb中配置選項。

config.assets.precompile += %w(additional/asset.css funky/stuff.js) 

上述線將所述文件附加/ asset.css和時髦/ stuff.js添加到當資產被預編譯,將產生的文件的列表(請注意,「+ =」是被用來擴展默認列表)。爲了儘可能的明確,這意味着你將有四個資源預編譯:application.js,funky/stuff.js,application.css和additional/asset.css。

這就是說,你可能想看看the guard-rails-assets寶石。該gem在支持預編譯的方式上很靈活;僅預編譯更改的資產是可能的。我聽到了一些很好的反饋,但沒有自己使用它。

+0

謝謝,這解決了我的問題與RefineryCMS不使用application.js。 http://stackoverflow.com/q/24023256/148844 – Chloe 2014-06-03 23:01:05

3

@Tigraine是不正確的。

有可能,您只需創建文件夾並將css文件放入其中,並將其導入資產文件夾中的不同文件即可。

application.css 
*= require_self 
*= require foundation_and_overrides 
*= require reset 
*= require_tree ./screen 

使得畫面是我放在樣式表文件夾內的文件夾。像assets/stylesheets/screen/。我打電話跟

<%= stylesheet_link_tag "application", media: "screen, projection" %> 

的application.css現在,如果你想創建爲您創造另一個佈局一個CSS文件,根據assets/stylesheets

像xxx.css

如果您需要多個文件爲XXX你按照上述相同的步驟,但這裏的重要組成部分,是你這行添加到

production.rb

config.assets.precompile += %w(xxx.css) 

然後裏面的佈置添加:

<%= stylesheet_link_tag "xxx", media: "screen, projection" %> 
+0

如何使用config.assets.precompile如果你有scss參與。也是需要的文件夾路徑,它在哪裏看?我們有一個特定於電子郵件的css,我們希望不將其包含在application.css中,因爲它的樣式僅適用於所有電子郵件。我們在〜/ app/assets/stylesheets /文件夾中有一個email.css.scss,使用Rails 3.2和assets pipeline。我們有生產的預編譯和cdn設置。我嘗試添加這一行,但它沒有工作,沒有編譯電子郵件。此外,似乎capistrano只在web機器上進行資產編譯,但電子郵件在延遲的作業工作器上運行... – bjm88 2016-03-25 14:01:47

12

如果你想預編譯只有一個文件,你可以做一個自定義的rake任務這樣做很容易。

namespace :assets do 

    desc "compile one js file" 

    task :compile_one_file => :environment do 
    dest = "#{Rails.root}/vendor/assets/javascripts/compiled/" 
    js_asset = "your_jsfile.js" 
    File.write(dest + js_asset, Uglifier.compile(Rails.application.assets.find_asset(js_asset).to_s)) 
    end 

end 

然後在命令行

rake assets:compile_one_file 

希望這會有所幫助,我覺得這是非常有用的,我不經常改變,如jQuery和jQuery插件廠商js文件。這種方式時,即時通訊開發中,它加快了我的頁面加載,保持資產管道不必爲我的供應商文件路由所有單獨的請求。它只是提供了我所有供應商js的一個縮小的js文件。

+0

我得到未初始化的常量Uglifier – bjm88 2016-03-25 14:07:32

+0

您需要安裝gem,然後在您的rake文件中需要它以便使用Uglifier庫。 – 2016-03-25 18:44:27

2

你可以完全不用Rails。這可以使事情運行得更快,具體取決於您的環境。

quick_compile.rb

require 'sprockets' 

sprocket = Sprockets::Environment.new 
sprocket.js_compressor = :uglifier # or read off config yml 
sprocket.append_path('app/assets/javascripts') # the directory that holds you js src. 

file = File.new('test_min.js','w+') # the output file path. 
file.puts(sprocket.find_asset('test.js')) # the file to complie 
file.close 

如果你只是想evalute的// = require語句,你可以刪除js_compressor設置。 Sprocket將連接所需的文件。