LoginSignup
24
27

More than 5 years have passed since last update.

package.jsonのdependenciesを自動更新するスクリプトを書く

Posted at

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オプションを使うと
バージョン番号が記述される仕様のようだ。
これを使おう。

動きとして、

  1. package.jsonのバージョン番号を全て"*"印に書き換える
  2. package.jsonのdependenciesの名称を全て取得する
  3. 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) {
    /*...*/
});

で使える。

Links

24
27
1

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
24
27