実行後、特定のファイルをnpm
パッケージからユーザーのローカルディレクトリに自動的にコピーしたい
npm install my-package
"files"
内でpackage.json
を宣言することで、それらをインストールできます。問題は---ファイルがローカルディレクトリに置かれないことです。したがって、postinstall
スクリプトを実行する必要があります。
しかし、パッケージがインストールされている場所(おそらくディレクトリツリーの上位)がわからないので、スクリプトを使用してファイルに確実にアクセスし、ローカルディレクトリにコピーするにはどうすればよいですか?
(ローカルディレクトリつまり---を実行する場所からnpm install my-package
ユーザーとしてパッケージを消費することを意味します。)
更新。 postinstall
スクリプトはnpm
所有のプロセスとして実行され、ホームディレクトリがnode_modules/my-package
であるため、単純な../../
以外の方法でユーザーのホームディレクトリにアクセスする方法がわかりません。
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",
},
var cwd = require('path').resolve();
注:解決する引数の文字列の長さがゼロの場合、現在の作業ディレクトリがそれらの代わりに使用されます。
何度も検索した結果、この作品はクロスプラットフォームであることがわかりました
"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)
私は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