web-dev-qa-db-ja.com

postinstall npmスクリプトを介してパッケージからローカルディレクトリにファイルを自動的にコピーする方法

実行後、特定のファイルをnpmパッケージからユーザーのローカルディレクトリに自動的にコピーしたい

npm install my-package

"files"内でpackage.jsonを宣言することで、それらをインストールできます。問題は---ファイルがローカルディレクトリに置かれないことです。したがって、postinstallスクリプトを実行する必要があります。

しかし、パッケージがインストールされている場所(おそらくディレクトリツリーの上位)がわからないので、スクリプトを使用してファイルに確実にアクセスし、ローカルディレクトリにコピーするにはどうすればよいですか?

ローカルディレクトリつまり---を実行する場所からnpm install my-packageユーザーとしてパッケージを消費することを意味します。)

更新。 postinstallスクリプトはnpm所有のプロセスとして実行され、ホームディレクトリがnode_modules/my-packageであるため、単純な../../以外の方法でユーザーのホームディレクトリにアクセスする方法がわかりません。

19
Dmitri Zaitsev

Npm 3.4以降、$ INIT_CWD envarを使用できます: https://blog.npmjs.org/post/164504728630/v540-2017-08-22

ライフサイクルスクリプトを実行すると、INIT_CWDにnpmが実行された元の作業ディレクトリが含まれるようになります。

修正するには、package.jsonのpostinstallスクリプトに以下を追加します。

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

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

注:解決する引数の文字列の長さがゼロの場合、現在の作業ディレクトリがそれらの代わりに使用されます。

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

3
hexagoncode

何度も検索した結果、この作品はクロスプラットフォームであることがわかりました

"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)
2
David Bradshaw

私は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

忘れずに!

chmod +x postinstall.sh