76 votes

Comment utiliser les scripts package.json pour copier des fichiers ayant une extension spécifique ?

J'essaie d'utiliser npm comme outil de construction.

L'une des pierres d'achoppement que j'ai rencontrées est que je dois copier des fichiers javascript d'un dossier à un autre. Le dossier source contient des fichiers typescript, des fichiers javascript et des fichiers map, mais dans le dossier cible, je ne suis intéressé que par les fichiers javascript.

Je ne veux pas faire une déclaration de copie pour chaque fichier, mais je voudrais copier tous les fichiers .js. En outre, mon dossier source contient des sous-dossiers qui contiennent également des fichiers javascript. Ceux-ci doivent être copiés également, et maintenir la structure des sous-dossiers.

Ce que j'ai essayé de faire, c'est d'utiliser PCN avec un filtre, mais je n'arrive pas à faire fonctionner le filtre. J'ai testé l'expression rationnelle utilisée dans le filtre et elle semble fonctionner correctement. Le test a été effectué à Testeur de Regex avec une expression régulière .*\.js$ et des chaînes de test comme main.ts , main.js main.js.map etc., et seules les chaînes .js ont été trouvées.

Mon paquet json contient les éléments suivants (en abrégé) :

{
    "scripts": {
        "copy": "ncp scripts wwwroot/scripts --filter=\".*(\\\\.js$)\"" 
    }, 
    "devDependencies": { 
        "ncp": "2.0.0.0" 
    }
}

Comme mon expression rationnelle se trouve dans une chaîne de caractères dans une chaîne de caractères, je l'ai mise en double-escape. J'ai également essayé d'autres variantes, par exemple :

--filter=/.*\.js$/g       - compilation error
--filter=/.*\\.js$/g      - no files copied
--filter=\".*\\.js$\"     - no files copied
--filter=\"/.*\\.js$/g\"  - no files copied
(no filter)               - all files copied

Je ne suis en aucun cas marié à NCP. Si quelque chose d'autre fonctionne mieux, je l'utiliserai.

Donc : Comment puis-je, à l'intérieur de la section scripts de package.json, copier uniquement les fichiers avec une extension spécifique vers un autre dossier ? Je suis presque sûr d'avoir oublié quelque chose d'absolument évident...

97voto

Matthew Bakaitis Points 2728

Attention ! Le paquet cpx semble être abandonné. cpy-cli, copyfiles, et d'autres solutions sont listées dans les commentaires ici ou les réponses, ci-dessous.

cpx pourrait être une bonne substitution.

Il dispose d'une CLI, vous permet d'utiliser des globs au lieu de regex, peut préserver l'arborescence des répertoires et est relativement à jour au moment où j'écris ces lignes.....

10 votes

Parfait. Maintenant mon script est "copy" : "cpx \"scripts/**/*.js\" wwwroot/scripts", avec la devDependency "cpx" : "1.3.1". C'est exactement ce que je cherchais.

0 votes

Oui, cpx est un outil vraiment génial. Bonne recommandation.

6 votes

Actuellement, cpx semble être abondonné et a des vulnérabilités ouvertes dans les dépendances. Je suggère d'utiliser cpy-cli sur la base de cpy .

40voto

kuchumovn Points 191

Il existe également un module npm appelé copyfiles https://github.com/calvinmetcalf/copyfiles

Par exemple, pour copier tous les *.css des fichiers de la ./src dans le dossier ./styles dossier :

copyfiles --flat src/*.css styles

4 votes

Pourquoi ne pas simplement cp -R ? J'utilise cp -R ./email/templates ./build/email et je suis curieux de connaître votre solution.

30 votes

@Woppi mon raisonnement serait, parce qu'il utilise des commandes d'OS, qui pourraient ne pas fonctionner sur d'autres OS.

8 votes

@Coo Je vois. Merci beaucoup d'avoir partagé votre raisonnement. Je vous en remercie.

8voto

Sagar Ghimire Points 152

Construction rapide de la compatibilité script (fonctionne aussi sous Windows) :

"build": "react-scripts build && mv build docs || move build docs",

5voto

Sorin Veștemean Points 450
@powershell copy \"D:/Path/untitled.txt\"  destionation-file.txt"

1voto

Zer0 Points 93

Vous pouvez utiliser gulp.js pour cela. Écrivez une tâche gulp pour isoler uniquement les fichiers js (/path/to/files/*.js) et déplacez-les vers la destination de votre choix. Cela ne nécessitera que quelques lignes de code. Incluez cela dans la section script du package.json si nécessaire.

Le lien vers gulp.js : https://gulpjs.com/

var gulp = require('gulp');
gulp.task('jscopy', function(){
  return gulp.src('client/templates/*.js')
    .pipe(gulp.dest('build/js'))
});

3 votes

Ajouter Gulp comme dépendance juste pour copier des fichiers est un peu exagéré. Si vous utilisez déjà/encore gulp, cela pourrait être une option.

1 votes

Oui, si quelqu'un utilise quelque chose comme webpack, il ne voudra pas ajouter gulp pour simplement utiliser la copie.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X