dependencyを最新にしたい
npm install
コマンドに'--saveや
--save-dev`オプションをつけると自動的にpackage.jsonに依存関係を追加してくれる。
さらに npm outdated
コマンドを使うと、最新じゃない依存関係の一覧を出してくれる。
でも最新にするには一個ずつ追加しなきゃならない。
めんどくさい。
細かい話はいーからまとめて依存関係のバージョンを最新化してほしい。
dependencyを最新化するスクリプトを設計する
バージョン番号のところに"*"や"latest"を使うと、常に最新のをとってきてくれるようにはなる。
"dependencies":{
"async":"*",
"glob":"latest"
}
だけどこれは配布先でnpm install
を走らせたときに、その瞬間の最新をとってくるということになる。
それは微妙だ。テストして配布する前の時点で固定はさせたい。
なので、何かしらスクプトを叩いた瞬間、すべて依存関係を最新化してpackage.jsonに記述された書きかわる、という形にしたい。
"async":"1.2.0",
-> "async":"1.5.0",
npm install
いろいろ試してみたところ、バージョン番号が*
になっている状態で--save-dev
オプションを使うと
バージョン番号が記述される仕様のようだ。
これを使おう。
動きとして、
- package.jsonのバージョン番号を全て"*"印に書き換える
- package.jsonのdependenciesの名称を全て取得する
-
npm install <取得したパッケージ名> --save
を実行する。
ということをすればよい。
dependencyを最新化するスクリプトを実装する
まずはpackage.jsonを書き換えてdependenciesとdevDependenciesのバージョンをすべて"*"にする
var fs = require('fs'),
pkgPath = require.resolve('./package.json'),
pkg = require(pkgPath);
function _setAllProperty(obj, val) {
obj = obj || {};
Object.keys(obj).forEach(function (key) {
obj[key] = val;
});
return obj;
}
pkg['dependencies'] = _setAllProperty(pkg['dependencies'], '*');
pkg['devDependencies'] = _setAllProperty(pkg['devDependencies'], '*');
fs.writeFile(pkgPath, JSON.stringify(pkg, null, 2), function(err) {
/**...**/
});
次に、npm install
コマンドの--save
,--save-dev
を使ってpackage.jsonのバージョンを書き直す。
var execcli = require('execcli'),
async = require('async');
async.series([
function (callback) {
var dependencyNames = Object.keys(pkg['dependencies']).sort();
var args = ['install'].concat(dependencyNames).concat(['--save']);
execcli('npm', args, {
cwd: path.dirname(pkgPath)
}, callback);
},
function (callback) {
var devDependencyNames = Object.keys(pkg['devDependencies']).sort();
var args = ['install'].concat(devDependencyNames).concat(['--save-dev']);
execcli('npm', args, {
cwd: path.dirname(pkgPath)
}, callback);
}
], function (err) {
callback(err);
});
無事できた。
npmパッケージとしてまとめる
あとはログを足したりテスト書いたりなんだりしてnpmパッケージにまとめて公開。
$ npm install ape-updating --save-dev
でインストールした後、
#!/usr/bin/env node
var apeUpdating = require('ape-updating');
// Update all dependencies
apeUpdating(function (err) {
/*...*/
});
で使える。