Procurando uma maneira de copiar arquivos no gulp e renomear com base no diretório pai

91

Para cada módulo, tenho alguns arquivos que precisam ser copiados para o diretório de compilação e estou procurando uma maneira de minimizar o código repetido deste:

gulp.src('./client/src/modules/signup/index.js')
  .pipe(gulp.dest('./build/public/js/signup'));

gulp.src('./client/src/modules/admin/index.js')
  .pipe(gulp.dest('./build/public/js/admin'));

para algo assim:

gulp.src('./client/src/modules/(.*)/index.js')
  .pipe(gulp.dest('./build/public/js/$1'));

Obviamente, o acima não funciona, então há uma maneira de fazer isso, ou um npm que já faz isso?

obrigado

chris
fonte

Respostas:

131

A melhor maneira é configurá-lo baseao fornecer arquivos, assim:

gulp.src('./client/src/modules/**/index.js', {base: './client/src/modules'})
  .pipe(gulp.dest('./build/public/js/'));

Isso diz gulp para usar o diretório de módulos como ponto de partida para determinar os caminhos relativos.

(Além disso, você pode usar /**/*.jsse quiser incluir todos os arquivos JS ...)

Excesso de zelo
fonte
6
Deve haver uma maneira mais dinâmica de fazer isso - e quando os arquivos src vêm de 2 diretórios diferentes e você deseja preservar seus diretórios em dest?
Ivan Durst
1
@IvanDurst Eu gerenciei esse caso específico com o código OP (resposta). usando a configuração de base e usando o caminho relativo do arquivo gulp para arquivos independentes e ./folder-example/**pastas e arquivos completos.
Caio Wilson
210

Não é a resposta, mas se aplica à aparência dessa pergunta nos resultados da pesquisa.

Para copiar arquivos / pastas no gulp

gulp.task('copy', () => gulp
  .src('index.js')
  .pipe(gulp.dest('dist'))
);
Kirk Strobeck
fonte
2
Hmmm ... meu gole diz que esta tarefa foi concluída, mas o arquivo de saída não existe.
Tyguy7
4
Você tem que retornar o fluxo para avisar Gulp quando a tarefa terminar.
Merott
2
Estou confuso por que uma resposta que diz "não é a resposta" tem mais votos positivos do que a resposta aceita que responde à pergunta. Não tenho certeza se devemos confundir ASSIM com respostas destinadas a fazer os mecanismos de pesquisa fazerem alguma coisa específica, em vez de fornecer respostas para a pergunta. Acho que é o trabalho dos mecanismos de pesquisa fazer algo útil com o que eles obtêm ao rastrear o site. Apenas meus $ 0,02
jinglesthula
9
@jinglesthula É um serviço útil para quem chega a essa questão por meio de mecanismos de pesquisa, independentemente de quão bem o mecanismo de pesquisa esteja fazendo seu trabalho. Eu agradeço.
jbkly
1
haha acabei de perceber que isso é mais popular do que a pergunta certa ou a resposta certa: P
Kirk Strobeck
5
return gulp.src('./client/src/modules/(.*)/index.js')  
  .pipe(gulp.dest('./build/public/js/$1'));

Funcionou para mim!

user2977367
fonte
.. mesmo assim, esta é a resposta.
Kirk Strobeck,
2
... então alguém pode reescrevê-lo para que ele faz o trabalho como é, para que as pessoas que vêm a esta página procurando por esse trecho exata do código pode realmente usá-lo?
Ivan Durst
Então ... parênteses e $ n "referências anteriores" são permitidos em globs src / dest? Eles não são regexes, afaik. Isso parece o que estou procurando, mas os documentos de vinil-fs são bastante concisos nas opções .src () e .dest () e o que é permitido nelas e como funcionam.
jinglesthula
3

O uso para preservar a árvore do diretório de entrada será preservado.

.pipe(gulp.dest(function(file) {
    var src = path.resolve(SRC_FOLDER);
    var final_dist = file.base.replace(src, '');
    return DIST_FOLDER + final_dist;
}))

Usando isso, você pode inserir o src: .src(SRC_FOLDER + '/**/*.js') .

As outras respostas não funcionaram para mim (como usar base:on src()}, porque alguns plug-ins achatam a árvore de diretórios.

brnmonteiro
fonte
0

copiar arquivos em paralelo

gulp.task('copy', gulp.parallel(
() =>  gulp.src('*.json').pipe(gulp.dest('build/')),
() =>  gulp.src('*.ico').pipe(gulp.dest('build/')),
() =>  gulp.src('img/**/*').pipe(gulp.dest('build/img/')),
)
);
Dan Alboteanu
fonte