開発時用のNodeモジュールをPerlでアップデートする

@nqounetです。

Node.jsは使っていて驚くことがいくつかあります。

ひとつはモジュールのバージョンアップが早いこと。

ひとつはモジュールが依存するモジュールを独自に持つこと。

モジュールの更新が早い

npmで-gを付けてインストールしたファイル群はnpm update -gでアップデートできますが、その量がとても多いです。

ただ、ザーッと見ていると同じモジュールも何度か見かけるような気がしました。

依存モジュールを独自に持っている

で、ログを見たり、インストールしたディレクトリを見ると、package.jsonに書いてあるモジュール群は、全てそのディレクトリに入っています。

例えば、gruntの依存モジュールでasync.jsがありますが、grunt-contrib-connectもasync.jsに依存しています。

手元でその2つのファイルを見てみると、バージョンが異なっています。

gruntが依存している方は、0.1.22、grunt-contrib-connectが依存している方は、0.2.10でした。

依存するモジュールをバージョンを固定したまま実行できるように、ローカルにモジュールを保持する仕組みになっているようですね。

勘違いしていたこと

gruntを使っていてあまりにも頻繁に沢山のモジュールをダウンロード、インストールするので嫌だなと思い、衝動的にいろいろなものを-gオプションでインストールした(例えばgrunt-contrib-connectとか)のですが、全く(?)意味がありませんでした。

グローバルの方にそのモジュールがあっても、結局はローカルに適切なバージョンのモジュールをインストールするので使われません。

むしろ、npm update -gの時に(使ってもいないのに)無駄にバージョンアップするため、余計なダウンロードが発生していました。

開発環境をアップデートする

yo webappで作成した環境にはpackage.jsonが既に作成されていますが、モジュールのバージョンは更新されているものが多いです。

例えば、gruntは、指定されているバージョンは0.4.1ですが、アップデートすれば0.4.4が入ります。

アップデートし、かつ、package.jsonも更新するにはnpm update --save-devで良いのですが、この場合、何故そうなるのか不明ですがgruntはアップデートされないようです。

そういうのをいちいち気にするのがアレなので、簡単なスクリプトを書いて実行するようにしました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
#!/usr/bin/env perl
use utf8;
use 5.012;

use JSON::XS qw(decode_json);
use Path::Tiny qw(path);

my $json = decode_json(path('package.json')->slurp);
my $modules = join(' ', keys $json->{devDependencies});
system(qq{npm install -D $modules});

地味に便利です。

手元で静的ファイルを更新する考え方

ウェブサイトをgruntで管理していて思うのですが、設定ファイルとコマンドでウェブサイトを更新するという考え方は別に新しいわけじゃないんですよ。

ただ、できることが多種多様になって、かつ、それが簡単なスクリプトを書いて組み合わせられる、というのが良いですね。

ローカル環境で編集したものをウェブに公開する、ということが、簡単にカスタマイズできるのはほんとうに素晴らしいことだと思います。

comments powered by Disqus
Hugo で構築されています。
テーマ StackJimmy によって設計されています。