ハッカソン

Okinawa.rb のハッカソンで Node を云々。

とりあえず

git かな、と言いつつ

$ npm install git

してみます。導入できない。なんとなくこの問題解決で終わっちゃう気がするな。

express の導入

は成功したな。express な example 起動してみます。

$ node app.js 

node.js:202
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'connect'
    at Function._resolveFilename (module.js:334:11)
    at Function._load (module.js:279:25)
    at Module.require (module.js:357:17)
    at require (module.js:368:17)
    at Object.<anonymous> (/home/rms/Documents/nodejs/express/lib/express.js:12:15)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Module.require (module.js:357:17)
$

connect なナニが無いらしい。

$ npm install connect
connect@2.0.0alpha1 ../../node_modules/connect 
├── qs@0.3.1
└── mime@1.2.4
$

で、リトライ。したら

Error: Cannot find module 'mime'

mime は今導入されたのではないの? と言いつつ

$ npm install mime
mime@1.2.4 ../../node_modules/mime 
$

だからな、と言いつつ起動リトライしたら

$ node app.js
node.js:202
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
Error: Cannot find module 'qs'

え、一応ヤッとけ、ってことなの?

$ npm install qs
qs@0.3.1 ../../node_modules/qs 
$

でどうかね、と言いつつ kickoff

$ node app.js 

node.js:202
        throw e; // process.nextTick error, or 'error' event on first tick
              ^
TypeError: Object function createApplication() {
  var app = connect();
  utils.merge(app, proto);
  app.init();
  return app;
} has no method 'createServer'
    at Object.<anonymous> (/home/rms/Documents/nodejs/express/examples/mvc/app.js:8:19)
    at Module._compile (module.js:432:26)
    at Object..js (module.js:450:10)
    at Module.load (module.js:351:31)
    at Function._load (module.js:310:12)
    at Array.<anonymous> (module.js:470:10)
    at EventEmitter._tickCallback (node.js:194:26)
$

うーん、これって example 自体が微妙なのかどうなのか。

package.json

Bundler の Gemfile 的なソレ、とのこと。がしかし、https://github.com/visionmedia/express.git なナニでは以下らしい。

s/express$ npm install
npm ERR! Unsupported
npm ERR! Not compatible with your version of node/npm: hamljs@0.5.1
npm ERR! Required: {"node":"0.4.x"}
npm ERR! Actual:   {"npm":"1.0.103","node":"0.5.10"}
npm ERR! 
npm ERR! System Linux 2.6.35-22-generic
npm ERR! command "node" "/home/rms/.nave/installed/0.5.10/bin/npm" "install"
npm ERR! cwd /home/rms/Documents/nodejs/express
npm ERR! node -v v0.5.10
npm ERR! npm -v 1.0.103
npm ERR! code ENOTSUP
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/rms/Documents/nodejs/express/npm-debug.log
npm not ok
$

結構とほほな事が多いけど仕方が無いっちゃ仕方が無い。一応以下は入れておいた方が良さげ。

  "dependencies": {
    "connect": "git://github.com/senchalabs/connect.git",
    "commander": "0.2.1",
    "mime": ">= 1.2.2",
    "qs": ">= 0.3.1",
    "mkdirp": "0.0.7"
  },

色々もごもごしてたら端末ベースで入ってるモジュールが違うことを発見。node_modules って何だろ。ググッてみたらば以下が出てきた。

とりあえず npm install には -g を付けねば、らしい。-g でどこに入るか、は以下で確認可能とのこと

$ npm root -g
~/.nave/installed/0.5.10/lib/node_modules
$

むむ。てーか、express なコマンドがタタけないのとか全部 -g が付いてないお陰ですな。とりあえず野良な node_modules は全部削除して -g でアレします。

$ npm install express -g
/home/rms/.nave/installed/0.5.10/bin/express -> /home/rms/.nave/installed/0.5.10/lib/node_modules/express/bin/express
mime@1.2.4 /home/rms/.nave/installed/0.5.10/lib/node_modules/express/node_modules/mime 
mkdirp@0.0.7 /home/rms/.nave/installed/0.5.10/lib/node_modules/express/node_modules/mkdirp 
qs@0.3.1 /home/rms/.nave/installed/0.5.10/lib/node_modules/express/node_modules/qs 
connect@1.7.2 /home/rms/.nave/installed/0.5.10/lib/node_modules/express/node_modules/connect 
express@2.5.0 /home/rms/.nave/installed/0.5.10/lib/node_modules/express 
$

commander をナニしなきゃいけないらしい。

$ npm install -g commander
commander@0.3.2 /home/rms/.nave/installed/0.5.10/lib/node_modules/commander 
$

で、こんどこそ express は見えるはず。

$ which express
/home/rms/.nave/installed/0.5.10/bin/express
$

scaffold 試してみます

$ express myapp
   create : myapp
   create : myapp/package.json
   create : myapp/app.js
   create : myapp/public
   create : myapp/routes
   create : myapp/routes/index.js
   create : myapp/views
   create : myapp/views/layout.jade
   create : myapp/views/index.jade
   create : myapp/public/javascripts
   create : myapp/public/images
   create : myapp/public/stylesheets
   create : myapp/public/stylesheets/style.css

   dont forget to install dependencies:
   $ cd myapp && npm install

$

を、一応以下な package.json がナニな模様。

{
    "name": "application-name"
  , "version": "0.0.1"
  , "private": true
  , "dependencies": {
      "express": "2.5.0"
    , "jade": ">= 0.0.1"
  }
}

一応 -g 付けときます。

$ npm install -g
mkdirp@0.0.7 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/jade/node_modules/mkdirp 
commander@0.2.1 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/jade/node_modules/commander 
jade@0.16.4 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/jade 
qs@0.3.1 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/express/node_modules/qs 
mime@1.2.4 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/express/node_modules/mime 
mkdirp@0.0.7 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/express/node_modules/mkdirp 
connect@1.7.2 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/express/node_modules/connect 
express@2.5.0 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/express 
application-name@0.0.1 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name 
$

最後のが微妙にアレだけどスルー。

動作確認

以下なコマンドでサーバ起動して

$ node app.js
Express server listening on port 3000 in development mode

http://localhost:3000 にアクセスしてみたのですが

Error: Cannot find module 'jade'

って言われてしまいました。npm list してみると以下な出力がナニ。

$ npm list
npm WARN express 2.5.0 Unmet dependency in /home/fuga/Documents/nodejs/myapp
npm WARN jade >= 0.0.1 Unmet dependency in /home/fuga/Documents/nodejs/myapp
application-name@0.0.1 /home/fuga/Documents/nodejs/myapp
├── UNMET DEPENDENCY express 2.5.0
└── UNMET DEPENDENCY jade >= 0.0.1
$

こりゃまた何か微妙なことしとるんだろうな。で、別な端末で npm list してみたら以下な訳ですよ。

$ npm list
/home/rms
└─┬ express@2.5.0 
  ├── connect@1.7.2 
  ├── mime@1.2.4 
  ├── mkdirp@0.0.7 
  └── qs@0.3.1 
$

何ソレ、というヤツですな。で、上に引用した npm install -g な出力を見てみるに

mkdirp@0.0.7 /home/rms/.nave/installed/0.5.10/lib/node_modules/application-name/node_modules/jade/node_modules/mkdirp 

application-name って何だよ、と。ちなみに違う端末で npm install してみるとどうなるか、というと

$ npm install -g jade
/home/rms/.nave/installed/0.5.10/bin/jade -> /home/rms/.nave/installed/0.5.10/lib/node_modules/jade/bin/jade
mkdirp@0.0.7 /home/rms/.nave/installed/0.5.10/lib/node_modules/jade/node_modules/mkdirp 
commander@0.2.1 /home/rms/.nave/installed/0.5.10/lib/node_modules/jade/node_modules/commander 
jade@0.16.4 /home/rms/.nave/installed/0.5.10/lib/node_modules/jade 
$ npm list
/home/rms
└─┬ express@2.5.0 
  ├── connect@1.7.2 
  ├── mime@1.2.4 
  ├── mkdirp@0.0.7 
  └── qs@0.3.1 
$

うーん、なんとなく腑にオチない感満点。とりあえずもっかいプロジェクトを作成しなおして言われた通りにしてみます。

$ express myapp
$ cd myapp
$ npm install
express@2.5.0 ./node_modules/express 
├── mkdirp@0.0.7
├── qs@0.3.1
├── connect@1.7.2
└── mime@1.2.4
jade@0.16.4 ./node_modules/jade 
├── commander@0.2.1
└── mkdirp@0.0.7
$

うーん、これで良いのかな。

$ node app.js 
Express server listening on port 3000 in development mode

これで何モノかが一応出力されました。てーことは、あのサンプルでも同じことすれば良いのかどうか。

$ npm install

なんか make が動きだしたので正しい、ってことなのかなぁ。

再度確認

myapp の中には node_modules がありますね。npm list の出力も以下。

$ npm list
application-name@0.0.1 /home/rms/Documents/nodejs/myapp
├─┬ express@2.5.0 
│ ├── connect@1.7.2 
│ ├── mime@1.2.4 
│ ├── mkdirp@0.0.7 
│ └── qs@0.3.1 
└─┬ jade@0.16.4 
  ├── commander@0.2.1 
  └── mkdirp@0.0.7 
$

これ、グローバルに対して影響が無い、という所で言うとなかなかイケてる、と言えるのかどうか。ちなみに中身を見てみると app.js が以下。

$ cat app.js 

/**
 * Module dependencies.
 */

var express = require('express')
  , routes = require('./routes')

var app = module.exports = express.createServer();

// Configuration

app.configure(function(){
  app.set('views', __dirname + '/views');
  app.set('view engine', 'jade');
  app.use(express.bodyParser());
  app.use(express.methodOverride());
  app.use(app.router);
  app.use(express.static(__dirname + '/public'));
});

app.configure('development', function(){
  app.use(express.errorHandler({ dumpExceptions: true, showStack: true })); 
});

app.configure('production', function(){
  app.use(express.errorHandler()); 
});

// Routes

app.get('/', routes.index);

app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
$

routes/index.js の中身はどうか、と言うと

/*
 * GET home page.
 */

exports.index = function(req, res){
  res.render('index', { title: 'Express' })
};

あるいは views/index.jade が以下。

h1= title
p Welcome to #{title}

とりあえずそのまんまっちゃそのまんまですな。

サンプル

だんまり、って思ってたら終わっていた。npm list の出力が以下。

$ npm list
npm WARN unmet dependency /home/rms/Documents/nodejs/express/node_modules/jade requires commander@'0.1.0' but will load
npm WARN unmet dependency /home/rms/Documents/nodejs/express/node_modules/commander,
npm WARN unmet dependency which is version 0.2.1
npm WARN formidable >= 0.9.3 Unmet dependency in /home/rms/Documents/nodejs/express/node_modules/connect-form
npm WARN redis >= 0.0.1 Unmet dependency in /home/rms/Documents/nodejs/express/node_modules/connect-redis
npm WARN cssom 0.2.0 Unmet dependency in /home/rms/Documents/nodejs/express/node_modules/stylus
npm WARN growl 1.1.0 Unmet dependency in /home/rms/Documents/nodejs/express/node_modules/stylus
express@3.0.0alpha1 /home/rms/Documents/nodejs/express
├── commander@0.2.1  invalid
├── connect@2.0.0alpha1 
├─┬ connect-form@0.2.1 
│ └── UNMET DEPENDENCY formidable >= 0.9.3
├─┬ connect-redis@1.1.0 
│ └── UNMET DEPENDENCY redis >= 0.0.1
├── ejs@0.4.2 
├── express-messages@0.0.2 
├── expresso@0.8.1 
├── jade@0.16.2 
├── mime@1.2.4 
├── mkdirp@0.0.7 
├── node-markdown@0.1.0 
├── qs@0.3.1 
├── should@0.2.1 
└─┬ stylus@0.13.0 
  ├── UNMET DEPENDENCY cssom 0.2.0
  └── UNMET DEPENDENCY growl 1.1.0
$

なんとなくダメなカンジ。この UNMET DEPENDENCY をどう解決したものやら。というか、これってそもそもグローバルに導入されてないと駄目とかそーゆーオチなのかなぁ。
今んとこグローバルなソレ的には以下。

$ npm list
/home/rms
└─┬ express@2.5.0 
  ├── connect@1.7.2 
  ├── mime@1.2.4 
  ├── mkdirp@0.0.7 
  └── qs@0.3.1 
$

とりあえず commander@0.1.0 を入れようとしてみたのですが

$ npm install commander@0.1.0
npm ERR! Unsupported
npm ERR! Not compatible with your version of node/npm: commander@0.1.0

と叱られますた。これはどうにもならんな。

戻る

git なソレを -g で云々にリトライ。以下なエラーを確認。

ERR! compress@0.1.9 preinstall: `node-waf clean || true; node-waf configure build`

compress@0.1.9 を入れようとしてみます。

コンパイルエラーが出とるな。てか
>||
npm ERR! Failed at the compress@0.1.9 preinstall script.
npm ERR! This is most likely a problem with the compress package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node-waf clean || true; node-waf configure build
npm ERR! You can get their info via:
npm ERR!     npm owner ls compress
npm ERR! There is likely additional logging output above.

て出力がアレ。このパケジが駄目、ってのは相当微妙なはずなのですが、どうなのでしょ。

色々見てたら

どうも不具合修正してもレジストリに upload しないと駄目云々な話を発見。リポジトリを以下に修正して

;registry = http://registry.npmjs.org/
registry = http://packages.dojofoundation.org/

導入リトライしてみたら

$ npm install compose -g
promised-io@0.2.3 /home/rms/.nave/installed/0.5.10/lib/node_modules/compose/node_modules/patr/node_modules/promised-io 
patr@0.2.5 /home/rms/.nave/installed/0.5.10/lib/node_modules/compose/node_modules/patr 
compose@0.1.2 /home/rms/.nave/installed/0.5.10/lib/node_modules/compose 
$

入ったよorz
最初の行のコメントな ; を削除して git 導入にトライ。

$ npm install git -g
npm ERR! TypeError: Cannot read property 'latest' of undefined
npm ERR!     at /home/rms/.nave/installed/0.5.10/lib/node_modules/npm/lib/cache.js:396:35
npm ERR!     at saved (/home/rms/.nave/installed/0.5.10/lib/node_modules/npm/lib/utils/npm-registry-client/get.js:136:7)
npm ERR!     at Object.cb [as oncomplete] (/home/rms/.nave/installed/0.5.10/lib/node_modules/npm/node_modules/graceful-fs/graceful-fs.js:36:9)
npm ERR! Report this *entire* log at:
npm ERR!     <http://github.com/isaacs/npm/issues>
npm ERR! or email it to:
npm ERR!     <npm-@googlegroups.com>
npm ERR! 
npm ERR! System Linux 2.6.35-22-generic
npm ERR! command "node" "/home/rms/.nave/installed/0.5.10/bin/npm" "install" "git" "-g"
npm ERR! cwd /home/rms
npm ERR! node -v v0.5.10
npm ERR! npm -v 1.0.103
npm ERR! type non_object_property_load
npm ERR! arguments [ 'latest', undefined ]
npm ERR! 
npm ERR! Additional logging details can be found in:
npm ERR!     /home/rms/npm-debug.log
npm not ok
$

何それorz
しかも registry 前のままだな。やっぱ一つしか指定できんのかな。一つにしてリトライしてみましたが compose@0.1.9 を欲しがります。しかも compose も微妙なトコに入ってるらしく、npm list では見えなかったりして。

$ npm list
/home/rms
└─┬ express@2.5.0 
  ├── connect@1.7.2 
  ├── mime@1.2.4 
  ├── mkdirp@0.0.7 
  └── qs@0.3.1 
$

これはなかなかに楽しいナニですな。しかし困った。

結局

2h 頑張りましたが git なナニは導入できず。ちょっとローカルな環境を一旦綺麗にして色々試してみた方が良いかもしれません。
流石に 0.x な道具はハードルが色々な意味で高いねぇ。