문제
나는 꿀꺽꿀꺽 프롬프트 플러그인.하지만 해당 입력을 다른 예에 전달하는 데 문제가 있습니다.
gulp.task('userinput', function(){
var myVar = 'MONKEY';
gulp.src('./templates/_component.*')
.pipe(prompt.prompt([
{
type: 'input',
name: 'userInput',
message: 'Say something'
}
], function(res){
myVar = res.userInput;
}))
.pipe(prompt.confirm('You said ' + myVar));
});
내가 들어간다고 가정하면 hello
프롬프트에서 나는 다음과 같은 확인 메시지를 기대하고 있었습니다. You said Hello
, 그러나 그것은 말한다 You said MONKEY
.
Gulp로 이것이 가능합니까?
해결책
여기서 문제는 두 번째 프롬프트('You said ' + myVar
) ~ 전에 첫 번째 프롬프트가 실행되었습니다:
- 세트
myVar
에게'MONKEY'
- 스트림 생성
- 만들다
src
비동기식 스트림 - 첫 번째 프롬프트를 생성하고 src 스트림에 추가합니다.
- 현재 값을 사용하여 두 번째 프롬프트 생성
myVar
, 첫 번째 프롬프트 스트림에 추가
- 만들다
- 이제 실행된 스트림만 처리됩니다.
- 소스 로드
- 첫 번째 프롬프트를 실행하고
myVar
- 이전에 생성된 메시지를 사용하여 두 번째 프롬프트를 실행합니다.
모든 것을 단일 스트림으로 유지하려는 경우 유일한 해결책은 클로저(함수)를 허용하는 항목 내에서 변수를 사용하는 것입니다.일부 플러그인은 이미 클로저를 인수로 허용하지만 대부분은 그렇지 않습니다.
여기서 작동하는 클로저로 스트림을 래핑하는 한 가지 솔루션은 다음과 같습니다. 꿀꺽꿀꺽, 이는 이 시나리오를 위해 특별히 설계된 것은 아니지만 작동해야 합니다.그것은 다음과 같습니다
var tap = require('gulp-tap');
//...
gulp.task('userinput', function(){
var myVar = 'MONKEY';
gulp.src('./templates/_component.*')
.pipe(prompt.prompt([
{
type: 'input',
name: 'userInput',
message: 'Say something'
}
], function(res){
myVar = res.userInput;
}))
.pipe(tap(function(file, t) {
// format is t.through(stream-function, [arguments...])
return t.through(prompt.confirm, ['You said ' + myVar]);
});
});
이는 클로저로 래핑되고 각 파일에 대해 평가되기 때문에 현재의 변수의 값입니다. 그러나 각 파일에서 작동하기 때문에 다음 메시지가 한 번만 표시됩니다. 각 파일이 처리되었습니다.
더 나은 해결책은 작업을 여러 개의 종속 작업으로 분리하는 것입니다.다음과 같이 보일 것입니다:
var myVar = 'MONKEY';
gulp.task('userinput1', function(){
return gulp.src('./templates/_component.*', {read: false})
.pipe(prompt.prompt([
{
type: 'input',
name: 'userInput',
message: 'Say something'
}
], function(res){
myVar = res.userInput;
}));
});
gulp.task('userinput', ['userinput1'], function() {
return gulp.src('./templates/_component.*')
.pipe(prompt.confirm('You said ' + myVar));
});
이제 첫 번째 작업(userinput1
)가 실행되고 완료됩니다. ~ 전에 두 번째 것은 처리됩니다(userinput2
), 변수가 올바르게 설정됩니다.
메모: 당신을 확인하십시오
return
그렇지 않으면 동기식으로 처리되어 변수가 설정되지 않습니다.
마지막으로, 포기하는 것이 더 합리적일 수 있습니다. gulp-prompt
실제로 스트림과 많은 관련이 없기 때문에 작업 전체입니다.작업 내에서 직접 Node JavaScript를 사용하여 사용자 입력을 수집하고(바람직하게는 동기식으로) 파일을 꿀꺽꿀꺽 스트림으로 처리하는 것이 더 나을 것입니다.