2014-03-29 91 views
3

.js.css文件縮小的常見做法是創建.min.js.min.css文件。問題是ShakeFilePatterns將使用此方案與//*.js這樣的模式匹配縮小和非縮小文件。 docs似乎建議爲每個像reg.jsmin.js的每個類似的擴展,但我不確定這是我想採取的路徑。這怎麼能在Shake中解決?如何使用Shake FilePatterns來縮小JS和CSS文件?

編輯:問題是使用getDirectoryFiles

js <- getDirectoryFiles "" ["//*.js"] 
let jsMins = map (-<.> "min" <.> "js") js 
need jsMins 

有一個爲"//*.min.js的目標是工作得很好,但getDirectoryFiles "" ["//*.js"]開始拿起產生.min.js文件。

+0

您需要一個既能拒絕又能接受基於它們名稱的文件的模式(即:像'^。*(?<!\。min)\。js $')這樣的正則表達式。我敢肯定,這不能用Shake FilePatterns來完成,因爲他們只承認,但不能拒絕基於名稱的文件。也許你可以預先篩選文件列表來排除那些名字中帶有「.min。」的文件。 –

+0

@ AlainO'Dea是正確的,Shake FilePattern不能拒絕基於他們的名字的路徑 - 這是一種非常有限的匹配語言形式。 –

+0

@ AlainO'Dea你知道我可以如何預先過濾發送給'getDirectoryFiles'的模式嗎?這就是真正的問題所在。 –

回答

2

我能想到的兩個備選方案:

後處理getDirectoryContents

呼叫getDirectoryContents然後過濾掉你不關心的值。喜歡的東西:

xs <- getDirectoryFiles "" ["//*.js"] 
need [x -<.> "min.js" | x <- xs, takeExtensions x == ".js"] 

如果在規則之外運行此代碼,例如在action,那麼它是100%正確的。如果您在規則中運行代碼,那麼規則將運行一次,新文件將出現,然後規則將再次運行(這也違反了lint,並且不是很好的構建衛生)。我懷疑你在規則之外運行,所以這種方法可能是一個好方法。

寫一個Oracle

如果你是一個規則裏面,你可以定義一個Oracle這就好比getDirectoryFiles,但跳過min文件。現在

newtype JsFiles = JsFiles() deriving (Show,Typeable,Eq,Hashable,Binary,NFData) 
addOracle $ \(JsFiles _) -> fmap (\x -> takeExtensions x == ".js") $ getDirectoryFiles "" ["//*.js"] 

您可以在規則中使用askOracle $ JsFiles(),當添加新的非min文件,它只會改變。

+0

因此,第一種方法的關鍵是在規則之外運行getDirectoryFiles。我目前在規則中運行它。這是我的問題。非常感謝!編輯:我不確定我不是一個規則。在這種情況下,'getDirectoryFiles'在'*>'的右側。 –

+1

'*>'的右邊是一條規則,所以我建議使用Oracle方法。 –

+0

看起來oracle方法與getDirectoryFiles方法有同樣的問題。 linter抱怨文件正在改變,並且在運行之間給出不一致的行爲。真正需要的是一種跟蹤'.js'文件而不跟蹤'.min.js'文件的方法。必須有一個更簡單的方法。 –

2

有幾種方法,爲.js VS .min.js編寫不同生成規則:

  1. 如果沒有曾經產生.js.css文件,只有使用現有的源文件,因此並不需要//*.js規則,然後只是讓你的最小化模式是//*.min.js,它會工作。

  2. 如果生成.js(例如,來自的CoffeeScript文件),則如果要生成在不同的目錄中.min.js.js文件,則可以在該水平,例如區分模式dist/*.min.jsdecafinate/*.js

  3. 使用?>模式,例如:

    (\x -> takeExtensions x == ".js") ?> \out -> ...

    注意takeExtensions(與後s),將只匹配文件,其完整的擴展.js,所以將不匹配myfile/test.min.js

如果解決方案1有效,請使用它(最簡單)。如果解決方案2自然地失敗了(例如,無論如何,這與你想要做的事情相匹配),但更容易擁有更多限制性模式,但選項3「在任何地方都可以正常工作」,所以我可能會這麼做。

注意p *> a被定義爲(p ?==) ?> a(加了很多好的錯誤消息的額外管道的!),所以?>沒有什麼特別的,並與您現有的規則工作愉快。我通常會發現約5-10%的規則使用?>模式。

+0

#1不會爲我工作,因爲我使用'js < - getDirectoryFiles「」[「// *。js」]'爲了得到我的js文件,將名稱修改爲'.min.js',然後'需要'它們,以便'// * .min.js'目標運行。問題是getDirecoryFiles開始檢測'.min.js'文件。 #3雖然可以工作。 –

+0

我想'getDirectoryFiles'可能需要相當於'?>'來解決我的問題。 –

+0

我在另一個答案中給出了一些'getDirectoryFiles'選項。您不能使用任意謂詞定義'getDirectoryFiles',因爲該函數在檢查構建是否乾淨時運行,因此無法訪問規則中的函數。相反,'?>'只有在髒東西時纔會運行,但即使這樣,它也不在規則內部,但是在頂層,可以很容易地獲得函數。 –