ハッカソン
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 な道具はハードルが色々な意味で高いねぇ。