Use gulp para selecionar e mover diretórios e seus arquivos

98

Atualmente estou usando o gulp para chamar um script bash que limpa meu dist/diretório e move os arquivos apropriados para o diretório limpo. Eu gostaria que isso fosse feito com gulp porque não tenho certeza se o script funcionaria em um sistema de arquivos não * nix.
Até agora, estou usando o módulo gulp-clean para limpar o dist/diretório, mas quando tento mover os diretórios necessários e seus arquivos para a pasta dist, os diretórios estão vazios.

var gulp = require('gulp'),
    clean = require('gulp-clean');

gulp.task('clean', function(){
  return gulp.src(['dist/*'], {read:false})
  .pipe(clean());
});

gulp.task('move',['clean'], function(){
  gulp.src(['_locales', 'icons', 'src/page_action', 'manifest.json'])
  .pipe(gulp.dest('dist'));
});

gulp.task('dist', ['move']);

a chamada gulp distresulta no dist/diretório sendo preenchido com os diretórios corretos, mas estão todos vazios

$ ls dist/*
dist/manifest.json

dist/_locales:

dist/icons:

dist/page_action:

Como copio os diretórios e seu conteúdo para a dist/pasta?

Makenova
fonte

Respostas:

162

Você precisa incluir a baseopção src, que preservará a estrutura do arquivo da maneira que desejar:

var filesToMove = [
        './_locales/**/*.*',
        './icons/**/*.*',
        './src/page_action/**/*.*',
        './manifest.json'
    ];

gulp.task('move',['clean'], function(){
  // the base option sets the relative root for the set of files,
  // preserving the folder structure
  gulp.src(filesToMove, { base: './' })
  .pipe(gulp.dest('dist'));
});

Além disso, você provavelmente terá problemas no caminho se tiver todos esses arquivos de origem na raiz do seu projeto.

Se puder, recomendo que você use uma única src/pasta e mova todos os arquivos específicos do aplicativo para lá. Isso torna a manutenção mais fácil no futuro e evita que seus arquivos específicos de construção se misturem com seus arquivos específicos de aplicativos.

Se você fizer isso, basta substituir todas as ocorrências de ./com src/no exemplo acima.

Excesso de zelo
fonte
1
Funcionou perfeitamente somente depois de reorganizar os arquivos, mas seu raciocínio é sólido, então estou marcando sua resposta como correta. Obrigado.
makenova
2
Para fazer o oposto, use gulp-flatten. stackoverflow.com/questions/21153338/…
Tony Gutierrez
2
Como uma observação para qualquer pessoa que fez isso, certifique-se de não ter a readopção src definida como false(é definida como truepor padrão).
yndolok
3
Quando faço isso, ele está copiando todos os diretórios raiz.
Nomadme
5

A questão original visa apenas diretórios (também conhecidas como pastas) em seu gulp.src, ou seja gulp.src(['_locales', ..., neste exemplo, _localesé o nome de um diretório .

A resposta aceita usa um globpadrão em seus arquivos degulp.src destino em qualquer lugar desses diretórios, ou seja , (observe os asteriscos duplos e os asteriscos nome_do_arquivo.extensão ). A resposta aceita funciona ...gulp.src(['./_locales/**/*.*', ...

... mas a resposta aceita apenas enfatiza a baseopção :

Você precisa incluir a baseopção para src ...

Eu experimentei e descobri:

  1. A rigor, não é necessário usar a baseopção para obter o que o OP pediu: "... e mover os arquivos apropriados para o diretório limpo." A baseopção que , de fato preservar o arquivo de pasta + estrutura (como descrito na resposta aceita), mas a baseopção é não suficiente para mover os arquivos como o OP perguntou . Preservar a estrutura de pastas + arquivos é provavelmente o que o OP espera , então a resposta aceita é boa, mas ...

  2. Apenas para reiterar o que move os arquivos, são os globpadrões:

    1. Asterisco duplo ( .../**/...) pesquisa recursivamente em todas as subpastas e subpastas 'subpastas', etc.

    2. Filename.extension asterisks ( .../*.*) encontra arquivos com todos os nomes e todas as extensões . Então eu acho que essa parte merece mais ênfase!

  3. A resposta aceita muda outra coisa; adiciona um prefixo de ./a cada caminho que os argumentos são passados gulp.src. Acho que isso é desnecessário / redundante; se não houver ./, (como na questão OP), os caminhos são resolvidos em relação ao diretório atual - resultando no mesmo comportamento . Mas talvez seja uma boa prática ser explícito com o./

Me avise se eu estiver enganado ...

The Red Pea
fonte