LoginSignup
5
5

More than 5 years have passed since last update.

chefでnpmパッケージをグローバルにインストールする時の工夫

Last updated at Posted at 2016-06-14

よくやりがちな事

%w{package_name1 package_name2}.each do |p|
  bash p do
    code <<-EOC
      npm install -g #{p}
    EOC
  end
end

このままだとchefを実行する度にnpm installが実行されます。
かかった時間は、

vagrant@precise32:~$ time sudo npm install -g grunt-cli
/usr/local/nvm/versions/node/v4.4.1/bin/grunt -> /usr/local/nvm/versions/node/v4.4.1/lib/node_modules/grunt-cli/bin/grunt
grunt-cli@1.2.0 /usr/local/nvm/versions/node/v4.4.1/lib/node_modules/grunt-cli
├── grunt-known-options@1.1.0
├── nopt@3.0.6 (abbrev@1.0.7)
├── resolve@1.1.7
└── findup-sync@0.3.0 (glob@5.0.15)

real    0m5.161s
user    0m3.940s
sys 0m1.000s

この例だと5秒かかっています。
パッケージが多いと、この積み重ねが結構辛くなります。

改善版

すでにインストール済みであればスキップするようにする。

%w{package_name1 package_name2}.each do |p|
  bash p do
    code <<-EOC
      npm install -g #{p}
    EOC
    not_if "npm list --depth=0 -g | grep ' #{p}@'"
  end
end

これで、スキップするのにかかった時間は、

vagrant@precise32:~$ time npm -g list --depth=0 | grep ' grunt-cli@'
├── grunt-cli@1.2.0

real    0m0.631s
user    0m0.528s
sys 0m0.096s

0.6秒で実際にインストールした場合と比べ約10分の1になります。

5
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5