package.jsonを使用して依存関係をグローバルおよびローカルにインストールする


189

npmを使用すると、-gオプションを使用してモジュールをグローバルにインストールできます。package.jsonファイルでこれを行うにはどうすればよいですか?

これらがpackage.jsonファイルの私の依存関係であるとします

"dependencies": {
    "mongoose": "1.4.0",
    "node.io" : "0.3.3",
    "jquery"  : "1.5.1",
    "jsdom"   : "0.2.0",
    "cron"    : "0.1.2"
  }

私が実行するときnpm install、私はnode.ioグローバルにインストールされたいだけで、残りはローカルにインストールされるべきです。これにはオプションがありますか?


11
できません。ただし"preferGlobal": true、モジュールのpackage.json内で設定できます。
レイノス

ええ、私は<code> preferGlobal </ code>について知っていますが、それはすべての依存関係をグローバルにインストールします...とにかくありがとう!そのような機能はないと思います...
Madhusudhan

3
そうは思わない。現在のモジュールをグローバルにインストールします。個々の依存関係でtrueに設定されている場合は、グローバルにインストールすることもできます。本当にあなただけ#のNode.jsで@isaacsを尋ねるべき
レイノス

3
グローバルインストールは、依存関係の地獄を生成する可能性があります。パッケージAにはバージョン0.3.3とパッケージBのバージョン0.3.4が必要であり、どちらも他のバージョンでは動作しないとします。次に、2つのパッケージを収容するために2つのマシンが必要になります。
09

6
これらのコメントはどれもこの問題で私を助けません...あなたがコードで私より多くを示すならそれはいいでしょう"preferGlobal":true...私はこれをpackage.jsonのどこに置くのか本当にわかりません。npmjs.org/doc/json.html NPMのドキュメントには、preferGlobalは独自のパッケージ用であり、設定すると独自のパッケージがグローバルとしてインストールされると記載されています。ただし、ガイドのように見えます。
PPPaul 2012年

回答:


216

新しいメモ:おそらくこれをしたくない、または行う必要がないでしょう。おそらくあなたがしたいことは、ビルド/テストなどのためにそれらのタイプのコマンド依存関係をdevDependenciespackage.jsonのセクションに置くことです。 package.json から何かを使用するときはいつでも、scripts(node_modules / .bin内の)devDependenciesコマンドは、パスにあるかのように動作します。

例えば:

npm i --save-dev mocha # Install test runner locally
npm i --save-dev babel # Install current babel locally

次にpackage.jsonで:

// devDependencies has mocha and babel now

"scripts": {
  "test": "mocha",
  "build": "babel -d lib src",
  "prepublish": "babel -d lib src"
}

次に、コマンドプロンプトで次のコマンドを実行します。

npm run build # finds babel
npm test # finds mocha

npm publish # will run babel first

ただし本当にグローバルにインストールする場合は、package.jsonのスクリプトセクションにプレインストールを追加できます。

"scripts": {
  "preinstall": "npm i -g themodule"
}

そのため、実際には私のnpm installがnpm installを再度実行します。

注:npmグローバルノードパッケージのインストールが必要な場所で最も一般的な設定を使用している場合、問題が発生する可能性がありますsudo。1つのオプションはnpm構成を変更することですので、これは必要ありません:

npm config set prefix ~/npm、に追加して$ HOME / npm / binを$ PATHに追加export PATH=$HOME/npm/bin:$PATHします~/.bashrc


3
これをで動作させることができませんでしたnpm i -g underscore-cli。wdが間違っているという警告が表示されます。wdは作業ディレクトリを意味します。私は手動でその後、物事がうまく行かコマンドラインでこれを行う際に、しかし、私は、ユーザーがシンプルで私のコードをインストールするに対処することができました場合は好むだろうnpm install
PPPaul

3
PPPaul-このトリックを最近再試行したときにも同じ問題が発生しました。たぶん私の設定が違うか、特定のモジュールでしか機能しないかもしれません。それ以外の場合、npmで何か変更されたと思いますか?
Jason Livesay

9
さらに、パッケージがすでにインストールされているかどうかを事前に確認できますnpm list module -g || npm install module -g。npmは適切な終了値を返すためです。
m90 2013年

3
@CMCDragonkai:これは別の質問です。ただし、コマンドをスクリプトに入れ、実行するコマンドとしてスクリプトを指定します(など"preinstall" : "scripts/preinstall.sh")。
私たちは全員モニカです

1
@CMCDragonkai &&は、たとえばと連結しますnpm install -g bower && npm install -g grunt-cli
Matsemann

12

以下に説明する欠点があるため、私は受け入れられた回答に従うことをお勧めします。

使用npm install --save-dev [package_name]してスクリプトを実行します。

$ npm run lint
$ npm run build
$ npm test

私の元の推奨されない答えは次のとおりです。


グローバルインストールを使用する代わりに、パッケージをdevDependencies--save-dev)に追加して、プロジェクト内のどこからでもバイナリを実行できます。

"$(npm bin)/<executable_name>" <arguments>...

あなたの場合:

"$(npm bin)"/node.io --help

このエンジニアnpm-execエイリアスをショートカットとして提供しました。 このエンジニアはと呼ばれるシェルスクリプトを使用しenv.shます。ただし$(npm bin)、余分なファイルや設定を避けるために、直接使用することを好みます。

それは各呼び出しを少し大きくしますが、うまくいくはずです

  • グローバルパッケージとの潜在的な依存関係の競合(@nalply)
  • の必要性 sudo
  • npmプレフィックスをセットアップする必要性(とにかく1つ使用することをお勧めします)

短所:

  • $(npm bin) Windowsでは動作しません。
  • 開発ツリーのより深いツールはnpm binフォルダーに表示されません。(それらを見つけるためにnpm-runまたはnpm-whichをインストールします。)

Jasonが上で示したように、より良い解決策は、の「スクリプト」セクションに一般的なタスク(ビルドやミニファイなど)を配置するpackage.jsonことです。


にエイリアスを.bashrc追加しbin/て、PATH環境変数にディレクトリを簡単に追加しますalias nodebin='export PATH=$(npm bin)/:$PATH'。実行するnodebinと、通常どおりコマンドを入力できます。
gitaarik 14

なぜそれがチームにとってうまくいかないのか私にはわかりません。もちろん、それを設定する必要があり、エイリアスを使用したくない場合は、それを選択します。しかし、チームで使用することは害にはなりません。
gitaarik 14

9

これは少し古いですが、私は要件に遭遇したので、ここで私が思いついた解決策があります。

問題:

開発チームは、AngularJS / Bootstrapに移行する多くの.NET Webアプリケーション製品を維持しています。VS2010はカスタムビルドプロセスに適しておらず、私の開発者は定期的に製品の複数のリリースに取り組んでいます。私たちのVCSはSubversionです(わかっています。わかっています。私はGitに移行しようとしていますが、厄介なマーケティングスタッフは非常に厳しいので)、単一のVSソリューションには複数の個別のプロジェクトが含まれます。同じマシンに同じNodeパッケージ(gulp、bowerなど)を何度もインストールすることなく、開発環境を初期化するための共通の方法をスタッフに用意する必要がありました。

TL; DR:

  1. グローバルなNode / Bower開発環境と、.NET製品にローカルで必要なすべてのパッケージをインストールするには、「npm install」が必要です。

  2. グローバルパッケージは、まだインストールされていない場合にのみインストールする必要があります。

  3. グローバルパッケージへのローカルリンクは自動的に作成する必要があります。

ソリューション:

すべての開発者とすべての製品で共有される共通の開発フレームワークがすでにあるため、必要に応じてグローバルパッケージをインストールしてローカルリンクを作成するNodeJSスクリプトを作成しました。このスクリプトは、製品のベースフォルダーに対して「.... \ SharedFiles」にあります。

/*******************************************************************************
* $Id: npm-setup.js 12785 2016-01-29 16:34:49Z sthames $
* ==============================================================================
* Parameters: 'links' - Create links in local environment, optional.
* 
* <p>NodeJS script to install common development environment packages in global
* environment. <c>packages</c> object contains list of packages to install.</p>
* 
* <p>Including 'links' creates links in local environment to global packages.</p>
* 
* <p><b>npm ls -g --json</b> command is run to provide the current list of 
* global packages for comparison to required packages. Packages are installed 
* only if not installed. If the package is installed but is not the required 
* package version, the existing package is removed and the required package is 
* installed.</p>.
*
* <p>When provided as a "preinstall" script in a "package.json" file, the "npm
* install" command calls this to verify global dependencies are installed.</p>
*******************************************************************************/
var exec = require('child_process').exec;
var fs   = require('fs');
var path = require('path');

/*---------------------------------------------------------------*/
/* List of packages to install and 'from' value to pass to 'npm  */
/* install'. Value must match the 'from' field in 'npm ls -json' */
/* so this script will recognize a package is already installed. */
/*---------------------------------------------------------------*/
var packages = 
  {
  "bower"                      :                      "bower@1.7.2", 
  "event-stream"               :               "event-stream@3.3.2",
  "gulp"                       :                       "gulp@3.9.0",
  "gulp-angular-templatecache" : "gulp-angular-templatecache@1.8.0",
  "gulp-clean"                 :                 "gulp-clean@0.3.1", 
  "gulp-concat"                :                "gulp-concat@2.6.0",
  "gulp-debug"                 :                 "gulp-debug@2.1.2",
  "gulp-filter"                :                "gulp-filter@3.0.1",
  "gulp-grep-contents"         :         "gulp-grep-contents@0.0.1",
  "gulp-if"                    :                    "gulp-if@2.0.0", 
  "gulp-inject"                :                "gulp-inject@3.0.0", 
  "gulp-minify-css"            :            "gulp-minify-css@1.2.3",
  "gulp-minify-html"           :           "gulp-minify-html@1.0.5",
  "gulp-minify-inline"         :         "gulp-minify-inline@0.1.1",
  "gulp-ng-annotate"           :           "gulp-ng-annotate@1.1.0",
  "gulp-processhtml"           :           "gulp-processhtml@1.1.0",
  "gulp-rev"                   :                   "gulp-rev@6.0.1",
  "gulp-rev-replace"           :           "gulp-rev-replace@0.4.3",
  "gulp-uglify"                :                "gulp-uglify@1.5.1",
  "gulp-useref"                :                "gulp-useref@3.0.4",
  "gulp-util"                  :                  "gulp-util@3.0.7",
  "lazypipe"                   :                   "lazypipe@1.0.1",
  "q"                          :                          "q@1.4.1",
  "through2"                   :                   "through2@2.0.0",

  /*---------------------------------------------------------------*/
  /* fork of 0.2.14 allows passing parameters to main-bower-files. */
  /*---------------------------------------------------------------*/
  "bower-main"                 : "git+https://github.com/Pyo25/bower-main.git" 
  }

/*******************************************************************************
* run */
/**
* Executes <c>cmd</c> in the shell and calls <c>cb</c> on success. Error aborts.
* 
* Note: Error code -4082 is EBUSY error which is sometimes thrown by npm for 
* reasons unknown. Possibly this is due to antivirus program scanning the file 
* but it sometimes happens in cases where an antivirus program does not explain 
* it. The error generally will not happen a second time so this method will call 
* itself to try the command again if the EBUSY error occurs.
* 
* @param  cmd  Command to execute.
* @param  cb   Method to call on success. Text returned from stdout is input.
*******************************************************************************/
var run = function(cmd, cb)
  {
  /*---------------------------------------------*/
  /* Increase the maxBuffer to 10MB for commands */
  /* with a lot of output. This is not necessary */
  /* with spawn but it has other issues.         */
  /*---------------------------------------------*/
  exec(cmd, { maxBuffer: 1000*1024 }, function(err, stdout)
    {
    if      (!err)                   cb(stdout);
    else if (err.code | 0 == -4082) run(cmd, cb);
    else throw err;
    });
  };

/*******************************************************************************
* runCommand */
/**
* Logs the command and calls <c>run</c>.
*******************************************************************************/
var runCommand = function(cmd, cb)
  {
  console.log(cmd);
  run(cmd, cb);
  }

/*******************************************************************************
* Main line
*******************************************************************************/
var doLinks  = (process.argv[2] || "").toLowerCase() == 'links';
var names    = Object.keys(packages);
var name;
var installed;
var links;

/*------------------------------------------*/
/* Get the list of installed packages for   */
/* version comparison and install packages. */
/*------------------------------------------*/
console.log('Configuring global Node environment...')
run('npm ls -g --json', function(stdout)
  {
  installed = JSON.parse(stdout).dependencies || {};
  doWhile();
  });

/*--------------------------------------------*/
/* Start of asynchronous package installation */
/* loop. Do until all packages installed.     */
/*--------------------------------------------*/
var doWhile = function()
  {
  if (name = names.shift())
    doWhile0();
  }

var doWhile0 = function()
  {
  /*----------------------------------------------*/
  /* Installed package specification comes from   */
  /* 'from' field of installed packages. Required */
  /* specification comes from the packages list.  */
  /*----------------------------------------------*/
  var current  = (installed[name] || {}).from;
  var required =   packages[name];

  /*---------------------------------------*/
  /* Install the package if not installed. */
  /*---------------------------------------*/
  if (!current)
    runCommand('npm install -g '+required, doWhile1);

  /*------------------------------------*/
  /* If the installed version does not  */
  /* match, uninstall and then install. */
  /*------------------------------------*/
  else if (current != required)
    {
    delete installed[name];
    runCommand('npm remove -g '+name, function() 
      {
      runCommand('npm remove '+name, doWhile0);
      });
    }

  /*------------------------------------*/
  /* Skip package if already installed. */
  /*------------------------------------*/
  else
    doWhile1();
  };

var doWhile1 = function()
  {
  /*-------------------------------------------------------*/
  /* Create link to global package from local environment. */
  /*-------------------------------------------------------*/
  if (doLinks && !fs.existsSync(path.join('node_modules', name)))
    runCommand('npm link '+name, doWhile);
  else
    doWhile();
  };

ここで、開発者向けのグローバルツールを更新する場合は、「packages」オブジェクトを更新して、新しいスクリプトをチェックインします。私の開発者はそれをチェックアウトし、「node npm-setup.js」を使用して実行するか、開発中の製品から「npm install」を実行してグローバル環境を更新します。全体で5分かかります。

さらに、新しい開発者向けの環境を構成するには、まずNodeJSとGIT for Windowsをインストールし、コンピューターを再起動し、「共有ファイル」フォルダーと開発中の製品をチェックアウトして、作業を開始する必要があります。

.NET製品の「package.json」は、インストール前にこのスクリプトを呼び出します。

{ 
"name"                    : "Books",
"description"             : "Node (npm) configuration for Books Database Web Application Tools",
"version"                 : "2.1.1",
"private"                 : true,
"scripts":
  {
  "preinstall"            : "node ../../SharedFiles/npm-setup.js links",
  "postinstall"           : "bower install"
  },
"dependencies": {}
}

ノート

  • スクリプト参照には、Windows環境でもスラッシュが必要です。

  • 「npm ls」は、「package.json」「dependencies」にリストされていないため、ローカルでリンクされたすべてのパッケージに対して「npm ERR!extraneous:」メッセージを表示します。

編集1/29/16

上記の更新されたnpm-setup.jsスクリプトは、次のように変更されています。

  • パッケージ「バージョン」は、コマンドラインでvar packages渡される「パッケージ」値になりnpm installました。これは、登録されたリポジトリ以外の場所からパッケージをインストールできるように変更されました。

  • パッケージがすでにインストールされているが、要求されたパッケージではない場合、既存のパッケージは削除され、正しいパッケージがインストールされます。

  • 不明な理由により、インストールまたはリンクを実行すると、npmは定期的にEBUSYエラー(-4082)をスローします。このエラーはトラップされ、コマンドが再実行されます。エラーはめったに2回発生せず、常に解消するようです。


これは命の恩人@ sthames42です!私はこれを正確に行う方法を理解しようと何時間もトローリングしてきました。明確、包括的、一般的に素晴らしい。#points質問:(a)既にパッケージリストにあるのに、なぜBowerがポストインストールにあるのですか?(b)グローバルパッケージをローカルでリンクしない方法は?コマンドに「リンク」を含めないでください。
MaxRocket

@MaxRocket:お役に立ててうれしいです。私は答えを更新して、より良く機能する私の最新のものを含めました。回答:(a) 'npm install'が実行された後に 'bower install'コマンドが実行され、ここに示されていないbower.jsonファイルにリストされているBowerコンポーネントがインストールされます。「npm install」と入力して、別のコマンドを入力しなくても環境を完全にセットアップできるようにしたいと思っていました。(b)はい。
sthames42

このスクリプトの現在のバージョンは、ここで維持されます
sthames42 2016

6

npm_globals.txt代わりに、などの別のファイルを使用できますpackage.json。このファイルは、このような新しい行に各モジュールを含みます、

mongoose@1.4.0
node.io@0.3.3
jquery@1.5.1
jsdom@0.2.0
cron@0.1.2

次に、コマンドラインで、

< npm_globals.txt xargs npm install -g

彼らが正しくインストールされたことを確認し、

npm list -g --depth=0

これを行うべきかどうかは、すべてユースケース次第だと思います。ほとんどのプロジェクトでは、これは必要ありません。そして、プロジェクトにpackage.jsonこれらのツールと依存関係を一緒にカプセル化させることは、はるかに好ましいことです。

しかし最近create-react-appでは、新しいマシンにジャンプすると、常に他のCLIをグローバルにインストールしていることがわかりました。バージョン管理があまり重要でない場合に、グローバルツールとその依存関係を簡単にインストールできる方法があると便利です。

そして、今日、私が使用していますnpxNPMパッケージランナーを、代わりにグローバルなパッケージをインストールします。


3

package.jsonのすべてのモジュールが./node_modules/にインストールされます

これを明示的に見つけることができませんでしたが、これはNPMの package.jsonリファレンスです。


1

独自のスクリプトを作成して、グローバル依存関係をインストールします。それはあまりかかりません。package.jsonは非常に拡張可能です。

const {execSync} = require('child_process');

JSON.parse(fs.readFileSync('package.json'))
     .globalDependencies.foreach(
         globaldep => execSync('npm i -g ' + globaldep)
     );

上記を使用して、以下のインラインにすることもできます!

以下のプレインストールを見てください:

{
  "name": "Project Name",
  "version": "0.1.0",
  "description": "Project Description",
  "main": "app.js",
  "scripts": {
    "preinstall": "node -e \"const {execSync} = require('child_process'); JSON.parse(fs.readFileSync('package.json')).globalDependencies.foreach(globaldep => execSync('npm i -g ' + globaldep));\"",
    "build": "your transpile/compile script",
    "start": "node app.js",
    "test": "./node_modules/.bin/mocha --reporter spec",
    "patch-release": "npm version patch && npm publish && git add . && git commit -m \"auto-commit\" && git push --follow-tags"
  },
  "dependencies": [
  },
  "globalDependencies": [
    "cordova@8.1.2",
    "ionic",
    "potato"
  ],
  "author": "author",
  "license": "MIT",
  "devDependencies": {
    "chai": "^4.2.0",
    "mocha": "^5.2.0"
  },
  "bin": {
    "app": "app.js"
  }
}

ノードの作成者は、package.jsonがプロジェクトファイルであることを認めない場合があります。しかしそうです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.