【问题标题】:Dynamically add version number to dest output files w/ grunt使用 grunt 将版本号动态添加到 dest 输出文件
【发布时间】:2013-12-07 04:33:40
【问题描述】:

我有一个带有我们版本号的package.json文件,例如:

{
    name: "myproject"
    version: "2.0"
}

我的目标是将 package.json 文件中的版本号动态添加到输出文件中。例如,在 javascript 中,我不想手动更新版本号,但希望在每次 grunt 构建后生成类似于此的内容:

/* My Project, v2.0 */
window.myProject = {
    version: "2.0"
};

在我的 Gruntfile.js 配置中是否有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: javascript node.js gruntjs


    【解决方案1】:

    我实现了:https://github.com/erickrdch/grunt-string-replace

    在我的源 css/js 文件中,我使用文本 {{ VERSION }} 替换为 package.json 文件中设置的版本号。以下是我添加到Gruntfile.js 的配置。

    'string-replace': {
      version: {
        files: {
          // the files I did string replacement on
        },
        options: {
          replacements: [{
            pattern: /{{ VERSION }}/g,
            replacement: '<%= pkg.version %>'
          }]
        }
      }
    },
    pkg: grunt.file.readJSON('package.json'),
    

    【讨论】:

    • 很好的自我回答——你也可以接受自己的回答;)
    【解决方案2】:

    我认为您只想做一些技巧,以使页面无法使用浏览器可能具有的缓存文件,而到目前为止,跨浏览器的唯一方法就是放置一些东西像“app.v2_2.js”或“app.js?ver=22”这样的href url。所以我使用了这个 grunt npm 包:

    https://www.npmjs.org/package/grunt-cache-breaker

    默认情况下,它只向您的 javascript 添加一个参数,并且在几乎所有情况下,您都需要不使用缓存,但即使您在其他 grunt 进程中更改文件名,您也可以进行配置。这只会将 HTML 标题更改为您想要的。

    安装 grunt-cache-breaker 后,将其添加到您的 GruntFile:

    // Append a timestamp to 'app.js', 'controllers.min.js' which are both located in 'index.html'
    // resulting in the index the call of : href="~/app.js?rel=1415124174159"...
            cachebreaker: {
                dev: {
                    options: {
                        match: ['app.js', 'styles.css']
                    },
                    files: {
                        src: ['dist/index.html']
                    }
                }
            },
    

    然后加载模块的位置:

    grunt.loadNpmTasks('grunt-cache-breaker');
    

    添加你想要的任务:

    grunt.registerTask('deploy', [
            'clean:app',
            'copy:views',
            'copy:imgs',
            'copy:css',
            'uglify:app',
            'cssmin:app',
            'cachebreaker:dev'
        ]);
    

    最后在控制台/命令提示符下运行 grunt 操作

    > grunt deploy
    

    【讨论】:

    • 非常可定制!
    • 如果已经有查询字符串,我们如何更新?我们可以用 cachebreaker 更新吗?
    【解决方案3】:

    我建议使用grunt-contrib-concat中的横幅功能

    【讨论】:

    • 谢谢...我一直在寻找另一个插件来执行此操作,尽管我确信我以前见过这个...现在我知道在哪里 <_>
    【解决方案4】:

    这也可以通过 https://github.com/gruntjs/grunt-contrib-uglify 的横幅选项来完成 - 它还负责 javascript 文件的小型化。

    【讨论】:

      【解决方案5】:

      filerev 现在提供此选项。使用 process 来操作文件名,否则将以文件内容的 md5 哈希为后缀。您可以使用它来将您的版本插入到您想要的每个文件中。

      参考:https://github.com/yeoman/grunt-filerev

      【讨论】:

        【解决方案6】:

        在项目的根目录中创建类似 package.json 的内容

        它应该读到,或者你可以做类似的事情

        pkg: grunt.file.readJSON('package.json'),
        

        因为您将有一个 version 声明,它显然对应于 &lt;%= pkg.version %&gt;,所以在您的 json 输出中包含该字符串,然后运行 ​​grunt.config.process 来进行变量替换

        对评论标题做类似的事情

        【讨论】:

        • 我知道这如何用于设置文件名,但是如何在文件内容中替换变量字符串?
        猜你喜欢
        • 2011-04-01
        • 1970-01-01
        • 2016-06-19
        • 2012-10-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-21
        • 1970-01-01
        相关资源
        最近更新 更多