2014-11-05 50 views
3

我一直在grunt-usemin的問題,它並沒有用單個revved行代替非加速引用塊。在參考塊中的兩個文件得到連接並且簡化得很好;單個文件metadata.min.js也獲得版本就好了;但是,對於revved文件的引用不會被插入到index.html中。只是非加速線。grunt-usemin沒有用reved文件行代替參考塊

我使用:

  • 咕嚕-usemin 2.6.0
  • 咕嚕-filerev 2.1.1
  • Zend框架爲模板(因此奇異模板路徑)

這裏是index.html參考塊之前正在運行grunt build:

<!-- build:js js/dest/metadata.min.js --> 
<script src="js/metadata/MetadataController.js"></script> 
<script src="js/metadata/MetadataService.js"></script> 
<!-- endbuild --> 

下面是相關咕嚕配置:

useminPrepare: { 
    html: '../cdm_common/cdm/layouts/scripts/index.html', 
    options: { 
    dest: 'dist', 
    root: '.' 
    } 
}, 

filerev: { 
    options: { 
    encoding: 'utf8', 
    algorithm: 'md5', 
    length: 8 
    }, 
    js: { 
    src: ['dist/js/dest/*.js'], 
    dest: 'js/dest/rev/test' 
    } 
}, 

usemin: { 
    html: '../cdm_common/cdm/layouts/scripts/index.html', 
    options: { 
    assetsDirs: ['js/dest/rev/test'] 
    } 
}, 

grunt.registerTask('build' ['useminPrepare','concat:generated','uglify:generated','filerev','usemin']); 

這裏後運行繁重的建設是中的index.html

<script src="js/dest/metadata.min.js"></script> 

任何理由加速運轉線不宜這個樣子?

<script src="js/dest/metadata.min.a5851d60.js"></script> 

這是grunt-usemin的錯誤嗎?在某個地方配置了一個配置嗎?雖然沒有真正回答,但它與以下類似:Usemin not replacing reference blocks in HTML

一直在我的頭上撞着桌子。任何見解都非常感謝。

回答

3

嘗試用一些更多的信息下面usemin配置中運行grunt --debug

usemin: { 
    html: '../cdm_common/cdm/layouts/scripts/index.html', 
    options: { 
    assetsDirs: ['js/dest/rev/test'], 
    blockReplacements: { 
     js: function (block) { 
      grunt.log.debug(JSON.stringify(block.dest)); 
      grunt.log.debug(JSON.stringify(grunt.filerev.summary)); 

      return '<script src="'+block.dest+'"></script>'; 
     } 
    } 
    } 
} 

這將回聲當前塊其生成並與由filerev修改的文件中的對象。

在我來說,我有一個額外的「公共/」文件夾,這樣我的字符串將不匹配的對象的關鍵,併爲此usemin無法找到filerev取得了新的位置:

[D] "js/build/vendors.js" 
[D] "public\\js\\build\\vendors.js": "public\\js\\build\\vendors.4e02ac3d2e56a0666608.js", "public\\js\\build\\main.js": "public\\js\\build\\main.acd1b38e56d54a170d6d.js"} 

最終我解決了這個問題與此自定義blockReplacements功能(即取代公共/和厭惡的Windows路徑):

js: function (block) { 
    var arr = {}; 
    for (var key in grunt.filerev.summary) { 
     arr[key.replace(/\\/g, "/").replace(/\/\//g, "/").replace("public/", "")] = grunt.filerev.summary[key].replace(/\\/g, "/"); 
    } 

    var path = (arr[block.dest] !== undefined) ? arr[block.dest] : block.dest; 

    return '<script src="{{ asset(\''+Twig.basePath + path +'\') }}"></script>'; 
}, 
3

這發生在我身上,以及和問題是由沒有在usemin塊正確assetDirs引起的。您需要確保您的assetDirs數組包含您的revved文件的父文件夾。

assetDirs documentation

這是目錄,在這裏我們應該開始尋找在當前看着文件中引用的資產的加速運轉版本的列表。

usemin: { 
    html: 'build/index.html', 
    options: { 
     assetsDirs: ['foo/bar', 'bar'] 
    } 
} 

假設index.html中你有一個參考/images/foo.png,usemin將搜索/images/foo.png的加速運轉的版本,說/images/foo.12345678.png任何assetsDirs選項中的目錄。

在其他詞語,給出上述結構,usemin將搜索這些文件中的一個存在:

富/酒吧/圖像/ foo.12345678.png

酒吧/圖像/ foo中。 12345678.png

@Billy大火應該能夠通過更新在他usemin塊assertDirs取代他的習慣blockReplacements功能是assetsDirs: ['js/dest/rev/test', 'public']

+0

非常感謝:) – 2015-03-13 11:17:07

0

除了什麼彌說,大約得到正確的assetsD irs路徑,您可以設置DEBUG變量以實際查看正在搜索文件的路徑。

如果您的構建任務是「建立」,那麼你就輸入:

DEBUG = usemin:*,revvedfinder咕嚕打造

這將有助於追查到底是什麼路徑(S),你需要在assetsDirs。