仅当src中有更改时才运行构建

ale*_*cxe 21 javascript build angularjs gruntjs protractor

故事:

我们有一个测试人员团队致力于使用量角器为我们的内部AngularJS应用程序自动化端到端测试.以下是他们通常为"本地"测试运行的任务:

grunt.registerTask('e2e:local', [
    'build:prod',
    'connect:test',
    'protractor:local'
]);
Run Code Online (Sandbox Code Playgroud)

它运行"构建"任务,启动Web服务器并针对本地构建运行e2e测试.

build:prod任务本身被定义为:

grunt.registerTask(
    'build:prod', [
        'clean',
        'copy:all',
        'copy:assets',
        'wiredep',
        'ngtemplates',
        'useminPrepare',
        'concat',
        'ngAnnotate',
        'autoprefixer',
        'uglify',
        'cssmin',
        'copy:cssfix',
        'usemin',
        'copy:html',
        'bowercopy',
        'template:setProdVersion'
    ]
);
Run Code Online (Sandbox Code Playgroud)

在这里我们有很多子任务(它肯定可以改进,但这就是它现在的样子).

问题:

目前,构建完成大约需要25秒.而且,每当一个人运行端到端测试时,都会执行构建任务.

问题:

build:prod如果src目录中有更改,我该如何运行任务?


请注意,此处的要求是使运行测试的测试人员透明.我不希望他们记住何时需要执行构建,何时不需要.

换句话说,该过程应该是自动化的.目标是自动检测是否需要构建.

请注意,理想情况下,我希望保持构建任务不变,因此,如果通过grunt build:prod它直接调用它,则无论前一个构建的日期戳是什么,都将重建.


思考和尝试:

  • 有一个密切相关的grunt-newer,但是,因为我们有一个相当复杂的构建,clean在开始时有一个任务,我不知道如何在我的情况下应用它

  • 我也想的是,里面e2e:local的任务,手动检查文件的时间戳内distsrc,并此基础上,决定是否build:prod需要被调用.我认为这grunt-newer就是在内部做的事情

  • 我们开始使用jit-grunt它有助于提高性能

Mel*_*igy 6

这是一个想法,如果你使用git:

如何使用像grunt-gitinfo这样的东西并使用HEAD中的最后一次提交作为基础?

这个想法是:

  • 您创建一个新的grunt任务,检查最新的提交哈希
  • 您将此提交哈希保存在已添加到的文件中gitignore(并且不在clean文件夹中,通常可以在repo的根目录中)
  • 在保存到文件之前,它会检查其中已有的值(标准节点fs模块可以轻松地进行读/写)
  • 如果哈希不匹配,则运行build:prod任务然后保存新的提交哈希
  • 测试人员的构建将取决于您的新任务而不是build:prod直接

另一种选择(仍然使用git):

你可以使用类似grunt-githooks的东西并创建一个在pull之后运行并调用git的git钩子build:prod,然后你可以从测试人员运行的grunt任务的依赖项中删除它.

您可能有另一个代码来检查githook并在必要时安装它,这可能是测试人员的一次性额外步骤,或者可能是他们调用的grunt任务.


J-D*_*zle 5

我很惊讶没有人提到grunt-contrib-watch(它在gruntjs.com示例文件中,我认为它是众所周知的!).来自github:"每当添加,更改或删除观看的文件模式时运行预定义的任务." - 下面是一个样本grunt文件,它可以在src /或test /中修改任何.js文件时运行你的任务,或者如果修改了Gruntfile.

var filesToWatch = ['Gruntfile.js', 'src/**/*.js', 'test/**/*.js'];
grunt.initConfig({
    watch: {
        files: filesToWatch,
        tasks: ['build:prod',
                'connect:test',
                'protractor:local']
    }
});
grunt.loadNpmTasks('grunt-contrib-watch');
Run Code Online (Sandbox Code Playgroud)

您让开发人员grunt watch在开始修改文件之前打开终端并运行,每次修改这些文件时,任务都会自动运行(不再grunt build:prod每次都要返回终端运行).

这是一个很好的包,我建议你看一下.- github - npmjs.org

npm install grunt-contrib-watch --save-dev
Run Code Online (Sandbox Code Playgroud)