src에 변경 사항이 있는 경우에만 빌드 실행
이야기:
당사에는 내부 Angular에 대해 트랙터를 사용하여 엔드 투 엔드 테스트를 자동화하는 작업을 수행하는 테스터 팀이 있습니다.JS application.이들이 "로컬" 테스트를 위해 실행하는 작업은 다음과 같습니다.
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초가 소요됩니다.그리고 사람이 엔드 투 엔드 테스트를 실행할 때마다 빌드 작업이 실행됩니다.
질문:
어떻게 실행할 수 있습니까?build:prod
이 있는 src
리?
여기서 요구하는 것은 테스트를 실행하는 테스트자를 위해 투명하게 만드는 것입니다.빌드를 수행해야 할 때와 수행하지 말아야 할 때를 기억하지 않았으면 합니다.
즉, 프로세스를 자동화해야 합니다.빌드가 필요한지 여부를 자동으로 감지하는 것이 목표입니다.
으로 를 통해 호출되는 빌드 grunt build:prod
이전 빌드의 날짜 스탬프에 관계없이 재구축됩니다.
생각과 시도:
밀접하게 관련된 패키지가 있지만, 우리는 다소 복잡한 빌드를 가지고 있기 때문에,
clean
제 에 어떻게 요,다.에서.
e2e:local
다크 합니다.dist
그리고.src
그리고 그것을 바탕으로, 결정합니다.build:prod
호출이 필요합니다.합니다인 것 .grunt-newer
다를 .우리는 성능 향상에 도움이 되는 것을 사용하기 시작했습니다.
git을 사용하는 경우 다음과 같은 아이디어가 있습니다.
grunt-gitinfo와 같은 것을 사용하고 HEAD의 마지막 커밋을 기본으로 사용하는 것은 어떻습니까?
아이디어는 다음과 같습니다.
- 최신 커밋 해시를 확인하는 새 그런트 태스크를 생성합니다.
- 를
gitignore
음)에 없음)clean
수 더음 repo으로) - () 합니다)을
fs
모듈이 읽기/쓰기를 쉽게 할 수 있음) - 합니다를 합니다.
build:prod
그런 새 - 는 됩니다 새.
build:prod
다른 옵션(여전히 git을 사용):
그룬트-기트 후크 같은 것을 사용하여 당긴 후에 실행하여 깃을 호출하는 깃 후크를 만들 수 있습니다.build:prod
에서 제거할 수 있습니다. grunt
기스턱을 확인하고 필요한 경우 설치할 다른 코드가 있을 수 있지만, 이 코드는 테스터에게 일회성 추가 단계가 될 수도 있고, 테스터가 호출하는 그룬트 작업에 구워질 수도 있습니다.
아직 아무도 grunt-contrib-watch에 대해 언급하지 않았다는 것이 놀랍습니다. (gruntjs.com 예제 파일에 나와 있고 꽤 흔하게 알려진 것이라고 생각했습니다!).github에서: "감시하는 파일 패턴이 추가, 변경 또는 삭제될 때마다 미리 정의된 작업 실행" - src/ 또는 test/에서 .js 파일이 수정되거나 Grunt 파일이 수정될 때마다 작업을 실행하는 grunt 파일 샘플입니다.
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');
를 하도록 합니다.grunt watch
할 때마다 됩니다(더에를 다음)).grunt build:prod
매번)
훌륭한 패키지이며 확인해보시기를 권합니다. -- github -- npmjs.org
npm install grunt-contrib-watch --save-dev
에서 .grunt
은 , , 으로 입니다.gulp
.
var fs = require('fs');
var gulpif = require('gulp-if');
var sourceChanged = fs.statSync('build/directory').mtime > fs.statSync('source/directory').mtime;
gulp.task('build:prod', function() {
if (!sourceChanged) {
return false;
}
return gulp.src('./src/*.js')
.pipe(.... build ....)
.pipe(gulp.dest('./dist/'));
});
우리가 우리의 빌드를 위해 Git HEAD Sha 작업을 수행한 방법은 다음과 같습니다.현재 운영 환경에 어떤 버전이 구축되어 있는지 확인하는 데 사용합니다. 하지만 부울을 반환하고 진실일 경우 빌드를 트리거하기 위해 재작업할 수 있을 것이라고 확신합니다.
Gruntfile.js
function getHeadSha() {
var curr, match, next = 'HEAD';
var repoDir = process.env.GIT_REPO_DIR || path.join(__dirname, '..');
try {
do {
curr = grunt.file.read(path.join(repoDir, '.git', next)).trim();
match = curr.match(/^ref: (.+)$/);
next = match && match[1];
} while (next);
} catch(ex) {
curr = 'not-found';
}
return curr;
}
grunt.initConfig({
replace: {
applicationVersion: {
src: '<%= config.dist %>/index.html',
overwrite: true,
replacements: [{
from: '{{APPLICATION_VERSION}}',
to: getHeadSha
}]
}
}
});
grunt.registerTask('build', {
'replace:applicationVersion',
/** other tasks **/
});
grunt.registerTask('e2e:local', {
'check_if_we_should_build',
/** other tasks **/
});
색인을 보다
<html data-version="{{APPLICATION_VERSION}}">
<!-- -->
</html>
이 모든 과정을 단순화할 수 있는 git-info 패키지도 있습니다. 우리는 그것으로 전환하는 것을 고려하고 있습니다.
편집; 나는 @meligy가 이미 당신을 git-info. credit으로 가리키는 것을 알아차렸습니다.
도움이 될지는 모르겠지만 GULP 프레임워크를 사용하여 프로젝트를 진행한 것과 같습니다.우리는 지속적으로 소스 변경을 확인하고 빠른 함수를 실행하여 프로젝트를 구축하는 watcher를 작성하였습니다.트랙터 테스트 케이스입니다.
gulp.task('dome', function () {
gulp.src(["maintest.js"])
.pipe(notify("Change Found , Executing Scripts."))
.pipe(protractor({
configFile: "conf.js",
args: ['--baseUrl', 'http://127.0.0.1:8000']
})).on('error', function (e) {
throw e
});
})
gulp.task('default', function () {
gulp.watch('./webpages/*.js', ['dome']);
gulp.watch('maintest.js', ['dome']);
gulp.watch('conf.js', ['dome']);
});
트랙터에 대한 경험은 없지만 개념적으로는 이게 효과가 있을 것 같아요.
제안할 수 있는 것은 ~/.cshrc에 별칭을 설정하여 다음과 같은 경우에만 빌드 명령을 실행하는 것입니다.diff
명령이 true를 반환합니다.
#./cshrc
alias build_on_diff 'diff -r branch_dir_1 branch_dir_2\
if ( $status == 1 ) then\
build:prod\
endif'
교체만 하면 됩니다.diff
git이 사용하는 명령은 무엇이든 사용할 수 있으며, 탐지된 차이에 대해 1 상태를 반환하는 경우에만 작동해야 합니다.변경되지 않은 파일을 재구축하지 않기 위해 저희 회사에서도 비슷한 방법을 적용하고 있습니다.
언급URL : https://stackoverflow.com/questions/31192065/run-build-only-if-there-are-changes-in-src
'programing' 카테고리의 다른 글
MySQL get mindate 및 maxdate를 하나의 쿼리로 얻을 수 있습니다. (0) | 2023.10.06 |
---|---|
Sql Server Unique Key도 Index입니까? (0) | 2023.10.06 |
지연 후 함수 실행 (0) | 2023.10.01 |
'valid xml'과 'well formed xml'의 차이가 있습니까? (0) | 2023.10.01 |
각도 비동기 파이프 및 객체 속성 (0) | 2023.10.01 |