2016-04-06 17 views
0

NPMのインストール方法の依存関係が変更されたときは確信が持てません。グランツとNPM、すべてのプロダクション依存関係をパッケージ化

package.json 
node_modules/ 
    abc/ 
     node_modules/ 
      xyz/ 
    some-dev-dep/ 

は私のノードをパッケージ化する場合:過去に
は、私は私のproject.jsonに、私は順番に「XYZ」に依存するであろう「ABC」への依存性を、持っていた場合、npm installのようなものになるだろうことを覚えておいてくださいAWS Lambdaが使用するプロジェクトであれば、そのnode_modules構造体(そこにあった開発者の依存関係は少なくなりました)を含める必要があります。私は私のパッケージングのためにうなり声を使用しますので、私は(私のgruntfile.jsの一部を抽出する)私は、このジップにすべての生産の依存関係を得るのを助けるために、この便利な事を書いた:

function getDependencies(pkg) { 
    return Object.keys(pkg.dependencies) 
     .map(function(val) { return val + '/**'; }); 
} 

var config = { 
    compress: { 
     prod: { 
      options: { 
       archive: 'public/lambda.zip' 
      }, 
      files: [ 
       { src: 'index.js', dest: '/' }, 
       { expand: true, cwd: 'node_modules/', src: getDependencies(pkg), dest: '/node_modules' } 
      ] 
     } 
    } 
}; 

これが働くだろう、私の依存関係の依存関係があったためネストされた。
これは変更されました(NPMの古いバージョンを使用していて、最近更新したときにはわかりません)。
今、私は順番に「XYZ」に依存して「ABC」に依存している場合、私は取得する:あなたが見ることができるように、唯一の生産の依存関係を取得する私の方法だけでは動作しません

node_modules/ 
    abc/ 
    xyz/ 
    some-dev-dep/ 


gruntジョブ内で、プロダクション依存関係の一覧(サブ依存関係と共に)だけを簡単に取得できますか?
再帰関数を使用して依存関係をスキャンし、project.jsonのファイルをチェックし、サブ依存関係などを検索することができます。このアプローチは、多くのプロジェクトで共通のシナリオである可能性があります。

+0

使用NVMあなたの依存関係をインストールするときは、NPM V2を使用できるように。そうすれば、node_modulesディレクトリ用の古い入れ子構造が得られます。 – idbehold

答えて

0

この変更は、npm 3のリリースで導入されました(npm v3 Dependency Resolution参照)。

グランを使う必要がある理由は明確ではありません。何がやりたいことだけ生産の依存関係を取得している場合は、単純に実行することができます:--productionフラグ付き

npm install --production

は、すべてのdevの依存関係は無視されます。 NODE_ENV環境変数が'production'に設定されている場合も同様です。

+0

私はこれを実行できるとは知っていますが、私はGruntジョブでプロダクションの依存関係のみを取得するために使用できません。今のところ私はzip/rpmに 'dist /'ディレクトリにコピーしたいファイルをコピーして 'npm install --production'を実行すると、パッケージはZIPやRPMにパッケージ化されます。 –

1

生産依存モジュール名の配列を返す関数です。 (注意:あなたは「NPM」モジュールは、これが機能するためには、プロジェクトにローカルにインストールする必要があるかもしれません。)

/** 
 
* Returns an array of the node dependencies needed for production. 
 
* See https://docs.npmjs.com/cli/ls for info on the 'npm ls' command. 
 
*/ 
 
var getProdDependencies = function(callback) { 
 
    require('child_process').exec('npm ls --prod=true --parseable=true', undefined, 
 
     function(err, stdout, stderr) { 
 
     var array = stdout.split('\n'); 
 
     var nodeModuleNames = []; 
 

 
     array.forEach(function(line) { 
 
      var index = line.indexOf('node_modules'); 
 
      if (index > -1) { 
 
      nodeModuleNames.push(line.substr(index + 13)); 
 
      } 
 
     }); 
 

 
     callback(nodeModuleNames); 
 
     }); 
 
};

+0

これは私が必要としているexcatlyです。 'ls --prod = true --parseable = true'です。ありがとう。 – psulek

+0

@psulek、私は助けてくれてうれしいです。 –

関連する問題