ゴミ箱の中のメモ帳

まだ見ぬ息子たちへ綴る手記

Ubuntu 12.04でnpm(node.js)を最新版にする あと注意事項

CSSメタ言語としてRooleを利用している。CSSメタ言語には他にもStylusだのSASSだのいろいろあるが、私はこのRooleが便利で利用している。PycharmがStylusをサポートしてて嫉妬している。
Rooleの作者に問い合わせ、マニュアルの日本語訳を公開する許諾を得たのでそのうち日本語訳したい。興味のある方がコメントしてくだされば日本語訳も早くするかもしれません。

そんなこんなでRooleを使っているのだが、Rooleはnode.jsのパッケージとして作成されている。node.js自体はUbuntuのaptにも公開されているため簡単にインストールできるのだが、そこはUbuntuの定め。バージョンが古い。

% sudo apt-get install nodejs
% npm --version
1.1.4
% sudo npm -g install roole
% roole --version
0.4.1


今まで特にこのバージョンでも不自由はしていなかったのだが、rooleをバージョンアップしようとするとnpmが古いという事でアップデート出来なかった。


なので、npmを最新版にする。インターネッツUbuntu 12.04 LTSのnode.jsを最新版にする方法を検索するとソースからビルドする方法が一般的なようだが、Ubuntuユーザとしてビルドエッセンシャルをインストールするわけには行かない。なので、PPAでnode.jsが無いか調べた。あった。なので追加。

% sudo add-apt-repository ppa:chris-lea/node.js
% sudo apt-get update
% sudo apt-get dist-upgrade
% npm --version
1.3.11

すばらしい。ただし、これには少々問題があったので最後まで読んでね。


そこでrooleのアップデート。

% sudo npm -g update roole
% roole --version
0.4.1

あれ。バージョン番号が上がらない。

ここで原因がわからずrooleのアンインストール等を試してみたがどうもバージョン番号が上がらない。最新版の「0.6.2」をバージョン指定をしてもバージョン番号が上がらない。なぜ? npmでインストールしたバージョンを見ても上がらない。原因がわかるまで10分以上かかった。

% which roole
/usr/local/bin/roole
% cat /usr/local/bin/roole| grep require
var fs = require('fs');
var path = require('path');
var mkdirp = require('mkdirp');
var program = require('commander');
var roole = require('../lib/roole');
% cat /usr/local/lib/node_modules/roole/package.json | grep version
  "version": "0.4.1",

バージョンが上がっていない。


だが思い出してみるとインストール時とPATHが違う。

% sudo npm -g install roole
...
/usr/bin/roole -> /usr/lib/node_modules/roole/bin/roole
roole@0.6.2 /usr/lib/node_modules/roole
├── pinpoint@1.1.0
├── promise-now@1.1.0
├── commander@2.0.0
├── chokidar@0.6.3
├── roole-parser@0.12.0
├── fs-extra@0.6.4 (jsonfile@1.0.1, ncp@0.4.2, mkdirp@0.3.5, rimraf@2.2.2)
├── roole-compiler@0.5.2 (tree-transformer@1.0.0)
├── roole-prefixer@0.3.1 (intersect@0.0.3, roole-node@0.5.1, tree-transformer@1.0.0)
└── roole-evaluator@0.21.0 (promise-any-first@1.0.0, roole-error@0.1.0, intersperse@1.0.0, roole-node@0.5.1, natural-range@1.0.0, floader@1.0.0, tree-transformer@1.0.0, tree-visitor@1.0.0, path-br@1.0.0, roole-builtin@0.4.0, tree-transformer-async@1.0.0)

これは気づかなかった。

PPAのnode.jsは「/usr/bin」にnpmパッケージをインストールするが、aptのnode.jsは「/usr/local/bin」にインストールするようだ。古いnpmパッケージが上書きされずに別のPATHにインストールされてしまう。この理由からコマンドの探索PATHが先にある「/usr/local/bin」にある古いパッケージが優先して使われてしまう。この問題さえわかればこのとおり。

% /usr/bin/roole --version
0.6.2

泣けた。久しぶりにハマった気がする。固定概念はよくない。


この問題はPPAのnode.jsを使ったからか、そもそもnode.jsがインストールPATHを変更したのか調べていないが、ハマる人がいるのではないかとメモに残しておく。npmでは数個のパッケージしかインストールしていなかったので、その場しのぎで手動で実行ファイルを削除し、「/usr/local/lib/node_modules」をリネームしておいた。これでいいかどうかはわからない。詳しい方教えて下さい。


Roole便利だよ。Roole!!

Web制作者のためのSassの教科書 これからのWebデザインの現場で必須のCSSメタ言語

Web制作者のためのSassの教科書 これからのWebデザインの現場で必須のCSSメタ言語

黒い画面は怖くない ターミナルでWeb製作をパワーアップ

黒い画面は怖くない ターミナルでWeb製作をパワーアップ

サーバサイドJavaScript Node.js入門

サーバサイドJavaScript Node.js入門

Node.jsプログラミングガイド

Node.jsプログラミングガイド