故事:
我们有一个测试人员团队致力于使用 Protractor 为我们的内部 AngularJS 应用程序自动化端到端测试。以下是他们通常为“本地”测试运行的任务:
grunt.registerTask('e2e:local', [
'build:prod',
'connect:test',
'protractor:local'
]);
它运行“构建”任务,启动网络服务器并针对本地构建运行 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'
]
);
这里我们有很多子任务(肯定可以改进,但现在看起来是这样)。
问题:
目前,构建完成大约需要 25 秒。而且,每次有人运行端到端测试时,都会执行构建任务。
问题:
只有在 src
目录发生变化的情况下,如何才能运行 build:prod
任务?
请注意,这里的要求是使其对运行测试的测试人员透明。我不希望他们记住什么时候需要执行构建,什么时候不需要。
换句话说,这个过程应该是自动化的。目标是自动检测是否需要构建。
请注意,理想情况下,我希望将构建任务保持原样,这样如果直接通过 grunt build:prod
调用它,它将重新构建,而不管先前构建的日期戳。
想法和尝试:
有密切相关的grunt-newer
package ,但是,由于我们有一个相当复杂的构建,一开始有一个 clean
任务,我不确定如何在我的情况下应用它
我还在考虑的是,在 e2e:local
任务中,手动检查 dist
和 src 中文件的时间戳
并据此决定是否需要调用 build:prod
。我认为这就是 grunt-newer
在内部做的事情
我们开始使用jit-grunt
这有助于提高性能
最佳答案
使用 grunt-gitinfo 之类的东西怎么样?并使用 HEAD 中的最后一次提交作为基础?
想法是:
gitignore
的文件中(并且不在 clean
文件夹中,通常可以在 repo 的根目录中)
fs
模块可以轻松地进行读/写)build:prod
任务然后保存新的提交哈希build:prod
您可以使用 grunt-githooks 之类的内容并创建一个在 pull 之后运行并调用 git build:prod
的 git 钩子(Hook),然后您可以将其从测试人员运行的 grunt 任务的依赖项中删除。
你可能有另一个代码来检查 gitook 并在需要时安装它,这对于测试人员来说可能是一次性的额外步骤,或者可能融入他们调用的 grunt 任务中。
https://stackoverflow.com/questions/31192065/