Hexoのプラグイン上でローカルサーバーを立ち上げている状態(hexo server : development環境)なのか、生成・デプロイをしている状態(hexo generate : production環境)なのかを判定したい時がありました。今回はその方法についてまとめてみました。

photo by Mr. Alex Garcia - Double Cliche on flickr

ちなみに、Hexoのテーマ上で判定する方法は下記をご覧ください。

当ブログ
Hexoのテンプレート上でserverとgenerateを判定する方法

Ads

プラグイン上で判定する方法とは?

まず先に結論を言ってしまうと、プラグイン上でローカルサーバーなのか、デプロイなのかを判定するには、hexoコマンドの引数を判定すればいいと考えています。

issueではどう議論されているか?

Hexoのissue#371によると、serverコマンド時にオプションとして--env='production'を渡す方法が提案されています。このオプションを指定すると、hexo global変数のenvの値が'development'から上書きされて'production'に変化します。

そこで、プラグイン側ではenvを見ればローカルサーバーが立ち上がっているのか、デプロイしているのかが判定できるという事だそうです。しかし、毎回オプションを指定するのは、かなり面倒。ましてや、Hexoユーザー全てがこのオプションを指定してくれる筈がありません(^^;)

ではどうするのか?

思いついたのが、先に述べたように、hexoコマンドの引数で状態を判定する案です。具体的にはHexo.env.args._の値を見ます。args._はコマンドの引数を取得できます。おそらくnodeのprocess.argvをhexoにそのまま渡してるのだと思います。

というこで、hexo serverhexo generate(deploy)を判定するには、以下のコードでいけそうです。

hexo-env/index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

function getEnv(inHexo){

var DEV = 'development';
var PRD = 'production';

if(inHexo){
if(inHexo.env.args._ && inHexo.env.args._.length > 0){
for(var i=0; i < inHexo.env.args._.length; i++){
if(inHexo.env.args._[i] == "s" || inHexo.env.args._[i] == "server")return DEV;
if(inHexo.env.args._[i] == "d" || inHexo.env.args._[i] == "deploy")return PRD;
if(inHexo.env.args._[i] == "g" || inHexo.env.args._[i] == "generate")return PRD;
}
}
}
return null;
};

module.exports.env = function (inHexo){
return getEnv(inHexo);
}

あとは、返ってくる状態('development' | 'production')に応じて、やりたい処理を切り分けるだけです。

your-hexo-plugin/index.js
1
2
3
4
5
6
7
var hexo_env = require('hexo-env');

if( hexo_env.env(hexo) == 'development' ){
// ローカルサーバーが立ち上がっているときに、やりたい処理
}else if( hexo_env.env(hexo) == 'production'){
// デプロイするときに、やりたい処理
}

ということで

プラグイン上でローカルサーバーなのか、デプロイなのかを判定するには、hexoコマンドの引数を判定すればいいという話でした。詳しくは、以下のプラグインを使ってみて下さい。

正直なところ、Hexoさんには、Railsのようにenvで一発判別できるようにしてほしいですね。最近のHexoバージョンは混沌としているので、ひとまず過去のバージョンでも利用できるような外部プラグインとして公開してみました。もしもっと良い方法があれば、twitterなどで教えて下さいね。それでは!

hexo-env