VagrantとChefでNode.jsの開発環境を構築する2

『JS+Node.jsによるWebクローラー/ネットエージェント開発テクニック』のサンプル実行環境の構築について。

{% amazon text 4883379930 %}

{% amazon medium_image 4883379930 %}

一つ前のエントリでnvmクックブックを使ってNode.jsの開発環境を構築する手順をまとめたが、いくつか不便な点があった。

  • sudoでnode、npmを使うために設定ファイルの編集が必要
  • npmパッケージのインストールは別途コマンドを打つ必要がある

上記の点を解決できないかと、nvmクックブックを使うのをやめて、nodejsクックブックで環境を作り直してみた。そもそもNode.jsのバージョンを変更する場合は、仮想マシンそのものを作り直すので敢えてnvmを使う必要もないと思う。

npmモジュールのインストールに合わせて、freetype、fontconfig、mecabなど必要なツールのインストールも追加した。

手順の差分を記載する。

Berksfile

# Berksfile
source 'https://supermarket.chef.io'

cookbook 'nodejs', '~> 2.4.4'
cookbook 'git', '~> 4.3.5'
cookbook 'sqlite', '~> 1.1.2'
cookbook 'vim', '~> 2.0.0'

カスタムクックブック

# metadata.rb

depends "nodejs"
# default.rb

# iconvモジュールインストール時に発生する下記エラーの対処
# error: ‘REPLACE_INVALID_UTF8’ is not a member of ‘v8::String’
# https://github.com/nodejs/nan/issues/414
nodejs_npm "npm"

nodejs_npm "cheerio-httpcli"
nodejs_npm "request"
nodejs_npm "xml2js"
nodejs_npm "phantomjs"
nodejs_npm "casperjs"
nodejs_npm 'iconv'
nodejs_npm 'jschardet'
nodejs_npm 'iconv-lite'
nodejs_npm 'json5'
nodejs_npm 'cson'
nodejs_npm 'js-yaml'
nodejs_npm 'ini'
nodejs_npm 'comma-separated-values'
nodejs_npm 'coffee-script'
nodejs_npm 'sqlite3'
nodejs_npm 'cheerio'
nodejs_npm 'level'
nodejs_npm 'pdfkit'
nodejs_npm 'officegen'
nodejs_npm 'twit'
nodejs_npm 'fb'
nodejs_npm 'apac'
nodejs_npm 'node-flickr'
nodejs_npm 'youtube-node'
nodejs_npm 'bayes'
nodejs_npm 'mecab-lite'
nodejs_npm 'svm'
nodejs_npm 'topojson'

# for PhantomJS & CasperJS
%w{freetype fontconfig}.each do |pkg|
  package pkg do
    action :install
  end
end

%w{gdal wget curl}.each do |pkg|
  package pkg do
    action :install
  end
end

Vagrantfile

# Vagrantfile

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(2) do |config|

  config.vm.box = "puphpet/centos65-x64"

  config.vm.network "forwarded_port", guest: 80, host: 8080
  config.vm.network "private_network", ip: "192.168.33.10"

  config.omnibus.chef_version = :latest

  config.vm.provision "chef_zero" do |chef|
      chef.cookbooks_path = ["chef-repo/cookbooks", "chef-repo/site-cookbooks"]

      chef.add_recipe "mecab"
      chef.add_recipe "nodejs"
      chef.add_recipe "git"
      chef.add_recipe "sqlite"
      chef.add_recipe "vim"

      chef.add_recipe "base"
  end
end

感想

  • nodejsモジュールでは、Node.jsのバージョンを指定することはできないらしい。今回実行したところ、v0.10.36がインストールされた。
  • npmパッケージのインストールをレシピにまとめることができた。

iconvモジュールのインストールで'REPLACE_INVALID_UTF8’ is not a member of ‘v8::String'というエラーが発生した。理由はよくわかっていないが、事前にnpm install -g npmを実行することでエラーを回避することができた。