web-dev-qa-db-fra.com

Comment copier automatiquement des fichiers d'un package dans un répertoire local via le script postinstall npm?

Je souhaite copier automatiquement certains fichiers d'un package npm dans le répertoire local de l'utilisateur après son exécution

npm install my-package

Je peux les installer en déclarant "files" dans package.json. Le problème est --- les fichiers ne sont pas placés dans le répertoire local. J'ai donc besoin d'exécuter le script postinstall.

Mais maintenant, je ne sais pas où le paquet est installé (peut-être plus haut dans l'arborescence), comment puis-je accéder de manière fiable aux fichiers et les copier dans le répertoire local via le script?

(Par répertoire local je veux dire --- depuis lequel je lance npm install my-package en tant qu'utilisateur consommant le paquet.)

METTRE À JOUR. Il semble que le script postinstall s'exécute en tant que processus appartenant à npm avec le répertoire personnel étant node_modules/my-package, aussi je ne sais toujours pas comment accéder au répertoire personnel de l'utilisateur autrement qu'avec le ../../ naïf.

15
Dmitri Zaitsev

Depuis npm 3.4, vous pouvez utiliser l’environnement $ INIT_CWD: https://blog.npmjs.org/post/164504728630/v540-2017-08-22

Lors de l'exécution des scripts de cycle de vie, INIT_CWD contient désormais le répertoire de travail d'origine à partir duquel npm a été exécuté.

Pour résoudre ce problème, ajoutez à votre script postinstall dans package.json les éléments suivants:

  "scripts": {
    "postinstall": "cp fileYouWantToCopy $INIT_CWD",
  },
3
jordins

var cwd = require('path').resolve();

Remarque: Si les arguments à résoudre ont des chaînes de longueur nulle, le répertoire de travail actuel sera utilisé à la place.

de https://nodejs.org/api/path.html

3
hexagoncode

Je voudrais utiliser shellscript/bash

-package.json

"scripts":
  "postinstall": "./postinstall.sh",

-postinstall.sh

#!/bin/bash

# go to YOUR_NEEDED_DIRECTORY .e.g "dist" or $INIT_CWD/dist
cd YOUR_NEEDED_DIRECTORY

# copy each file/dir to user dir(~/)
for node in `ls`
do
  cp -R $node ~/$node
done

N'oubliez pas de!

chmod +x postinstall.sh
1