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

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 ...)


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'))
);

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!


.. 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.


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/')),
)
);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.