使用grunt-wiredep为Grunt + Bower提供的绝对路径

时间:2014-06-08 19:04:52

标签: gruntjs bower bower-install grunt-wiredep wiredep

grunt-wiedep任务输出资产的相对路径。我需要绝对路径。 因此,我按照此处的建议重新配置了replace块:https://github.com/stephenplusplus/grunt-wiredep/issues/46

但是,在按照建议指定replace块后,我将以下内容添加为我的脚本引用。如你所见,这是错误的。

<script src="/../../../public/vendors/jquery/dist/jquery.js"></script>
<script src="/../../../public/vendors/angular/angular.js"></script>
<script src="/../../../public/vendors/angular-resource/angular-resource.js"></script>
<script src="/../../../public/vendors/angular-route/angular-route.js"></script>

我想要的是这个:

<script src="/vendors/jquery/dist/jquery.js"></script>
<script src="/vendors/angular/angular.js"></script>
<script src="/vendors/angular-resource/angular-resource.js"></script>
<script src="/vendors/angular-route/angular-route.js"></script>

所以,我试过这个替换块。请注意RegEx

replace: {
    js: '<script src="/{{filePath}}"></script>'.replace(/\.\.\/public/gi, ''),
    css: '<link rel="stylesheet" href="/{{filePath}}" />'.replace(/\.\.\/public/gi, '')
}

但似乎{{filePath}}稍后被替换,因此RegEx不会产生预期结果。

处理这种情况的理想方法是什么?

2 个答案:

答案 0 :(得分:16)

在wiredep的gruntfile.js配置中添加以下内容: ignorePath: '/../../../public'

这将从wiredep创建的路径的开头删除该部分。

例如类似的内容,以及对配置的任何调整:

wiredep: {
    target: {
        src: [
            '/Views/**/*.html',
        ],          
        ignorePath: '/../../../public',
        dependencies: true,
        devDependencies: false, 
    }
},

答案 1 :(得分:10)

根据Robert Noack的回答,您可以使用RegEx作为ignorePath值。我个人使用以下模式来删除相对路径,但保持匹配的最后一个正斜杠,以便最终输出为绝对路径:

/^(\/|\.+(?!\/[^\.]))+\.+/

这是如何工作的:

^                  // Start matching at first character in string
(
    \/             // [1] Look for "/"
  |                //  OR
    \.+            // [2] Look for "." repeated one or more times, followed by
    (?!            //   [3] Don't match
        \/[^\.]    //     "/" followed by a character that is not "."
    )              
)+
\.+                // [4] Look for remaining "." not including the next "/"

因此,如果我们的输出文件路径是/../../../path/to/file.js,我们首先删除第一个/ [1],然后删除../../ [2],但跳过最后{{1} } [3]。我们现在离开了../但我们删除了../path/to/file.js [4],结果为..

最后,我的配置如下所示:

/path/to/file.js

我的HTML输出如下:

wiredep: {
    app: {
        src: [
            "<%= config.app %>/templates/**/*.html"
        ],
        exclude: [
            "modernizr"
        ],
        ignorePath: /^(\/|\.+(?!\/[^\.]))+\.+/,
        devDependencies: true
    }
}