webentwicklung-frage-antwort-db.com.de

Wie kopiere ich automatisch Dateien aus dem Paket in das lokale Verzeichnis per Postinstall-Npm-Skript?

Ich möchte automatisch bestimmte Dateien aus einem npm-Paket in das lokale Verzeichnis des Benutzers kopieren, nachdem ich sie ausgeführt habe

npm install my-package

Ich kann sie installieren lassen, indem ich "files" in package.json deklariere. Das Problem ist --- die Dateien werden nicht in das lokale Verzeichnis gestellt. Also muss ich postinstall script ausführen.

Aber jetzt weiß ich nicht, wo das Paket installiert ist (möglicherweise höher im Verzeichnisbaum). Wie kann ich also zuverlässig auf die Dateien zugreifen und sie über das Skript in das lokale Verzeichnis kopieren?

(Mit lokales Verzeichnis meine ich --- von wo aus ich npm install my-package als Benutzer das Paket konsumiere.)

AKTUALISIEREN. Es scheint, dass das Skript postinstall als npm-eigener Prozess mit dem Basisverzeichnis node_modules/my-package ausgeführt wird. Daher weiß ich immer noch nicht, wie ich auf das Basisverzeichnis des Benutzers zugreifen soll, außer mit dem naiven ../../.

15
Dmitri Zaitsev

Seit npm 3.4 können Sie die $ INIT_CWD-Envar verwenden: https://blog.npmjs.org/post/164504728630/v540-2017-08-22

Wenn Sie Lebenszyklus-Skripts ausführen, enthält INIT_CWD jetzt das ursprüngliche Arbeitsverzeichnis, aus dem npm ausgeführt wurde.

Um das Problem zu beheben, fügen Sie folgendes Postinstall-Skript in package.json hinzu:

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

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

Hinweis: Wenn die aufzulösenden Argumente Zeichenfolgen mit der Länge Null haben, wird das aktuelle Arbeitsverzeichnis anstelle von ihnen verwendet.

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

3
hexagoncode

Ich würde Shellscript/Bash verwenden

-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

Vergiss es nicht!

chmod +x postinstall.sh

Nach langem Suchen habe ich festgestellt, dass dies plattformübergreifend funktioniert

"scripts":
  "postinstall": "node ./post-instal.js",

// post-install.js

/**
 * Script to run after npm install
 *
 * Copy selected files to user's directory
 */

'use strict'

var gentlyCopy = require('gently-copy')

var filesToCopy = ['.my-env-file', 'demo']

// User's local directory
var userPath = process.env.INIT_CWD

// Moving files to user's local directory
gentlyCopy(filesToCopy, userPath)
0
David Bradshaw