趣味的なIT・ネットの話題

Raspberry PiでIoTなシステム開発:nodeのインストールが楽になった

Raspberry PiでIoTなシステム開発: Raspberry Pi にバイナリでNode.jsをインストール

しばらく前に公式サイトからnodeのARM用バイナリが提供されなくなり、ネットでバイナリを探してインスト−ルをしていました。が、遂に公式でのARM用バイナリの配布が再開されたようです。それもv6/v7/v8も、4系も5系もとう大盤振る舞い。

Download | Node.js

せっかくなのでこれを使ってインストールできるか試してみることにします。公式でのディレクションはcurlで直接nodeをインストールしていますが、まだ4系、5系のどちらを使うか決めていないので、nvmを使ってインストールして、後からバージョンを切り替えられるようにします。Jessieだとcurlはあえてインストールしなくても最初から使えました。

pi@raspberrypi:~ $ curl
curl: try 'curl --help' or 'curl --manual' for more information

pi@raspberrypi:~ $ curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.31.0/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100  7766  100  7766    0     0   3738      0  0:00:02  0:00:02 --:--:--  3740
=> Downloading nvm from git to '/home/pi/.nvm'
=> Cloning into '/home/pi/.nvm'...
remote: Counting objects: 4402, done.
remote: Compressing objects: 100% (3/3), done.
remote: Total 4402 (delta 0), reused 0 (delta 0), pack-reused 4399
Receiving objects: 100% (4402/4402), 1.10 MiB | 562.00 KiB/s, done.
Resolving deltas: 100% (2582/2582), done.
Checking connectivity... done.
* (detached from v0.31.0)
  master

=> Appending source string to /home/pi/.bashrc
=> Close and reopen your terminal to start using nvm

pi@raspberrypi:~ $ nvm
-bash: nvm: command not found

パスが反映されていないようで、そのままだと実行できません。sourceすればいいと思いますが、ここはログインしなおしました。

pi@raspberrypi:~ $ nvm

Node Version Manager

Note: <version> refers to any version-like string nvm understands. This includes:
  - full or partial version numbers, starting with an optional "v" (0.10, v0.1.2, v1)
  - default (built-in) aliases: node, stable, unstable, iojs, system
  - custom aliases you define with `nvm alias foo`

Usage:
  nvm help                                  Show this message
  nvm --version                             Print out the latest released version of nvm
  nvm install [-s] <version>                Download and install a <version>, [-s] from source. Uses .nvmrc if available
    --reinstall-packages-from=<version>     When installing, reinstall packages installed in <node|iojs|node version number>
  nvm uninstall <version>                   Uninstall a version
  nvm use [--silent] <version>              Modify PATH to use <version>. Uses .nvmrc if available
  nvm exec [--silent] <version> [<command>] Run <command> on <version>. Uses .nvmrc if available
  nvm run [--silent] <version> [<args>]     Run `node` on <version> with <args> as arguments. Uses .nvmrc if available
  nvm current                               Display currently activated version
  nvm ls                                    List installed versions
  nvm ls <version>                          List versions matching a given description
  nvm ls-remote                             List remote versions available for install
  nvm version <version>                     Resolve the given description to a single local version
  nvm version-remote <version>              Resolve the given description to a single remote version
  nvm deactivate                            Undo effects of `nvm` on current shell
  nvm alias [<pattern>]                     Show all aliases beginning with <pattern>
  nvm alias <name> <version>                Set an alias named <name> pointing to <version>
  nvm unalias <name>                        Deletes the alias named <name>
  nvm reinstall-packages <version>          Reinstall global `npm` packages contained in <version> to current version
  nvm unload                                Unload `nvm` from shell
  nvm which [<version>]                     Display path to installed node version. Uses .nvmrc if available

Example:
  nvm install v0.10.32                  Install a specific version number
  nvm use 0.10                          Use the latest available 0.10.x release
  nvm run 0.10.32 app.js                Run app.js using node v0.10.32
  nvm exec 0.10.32 node app.js          Run `node app.js` with the PATH pointing to node v0.10.32
  nvm alias default 0.10.32             Set default node version on a shell

Note:
  to remove, delete, or uninstall nvm - just remove the `$NVM_DIR` folder (usually `~/.nvm`)


pi@raspberrypi:~ $ nvm --version
0.31.0

バージョンもヘルプも表示されます。さっそくnvmを使ってnodeをインストールします。「5系の最新」という指定の方法が分かりませんでしたのでバージョン番号を指定しました。ヘルプからするとv5と指定するだけでよかったんでしょうか。

pi@raspberrypi:~ $ nvm install v5.7.1
Downloading https://nodejs.org/dist/v5.7.1/node-v5.7.1-linux-armv7l.tar.xz...
######################################################################## 100.0%
Now using node v5.7.1 (npm v3.6.0)
Creating default alias: default -> v5.7.1
pi@raspberrypi:~ $ node
> 
(To exit, press ^C again or type .exit)
> 
pi@raspberrypi:~ $ node -v
v5.7.1

コンソールから実行してみます。

pi@raspberrypi:~ $ node 
> console.log("hello world");
hello world
undefined
> 
(To exit, press ^C again or type .exit)
>

ちゃんとJavascriptを解釈してくれたようです。

インストールパスを知りたかったのですが、nvmのコマンドでは分からないようでした。findして実体を探してみると、piでインストールしているのでpiのホームに入るのですね。当たり前か。

pi@raspberrypi:~ $ nvm ls
->       v5.7.1
default -> v5.7.1
node -> stable (-> v5.7.1) (default)
stable -> 5.7 (-> v5.7.1) (default)
iojs -> N/A (default)

pi@raspberrypi:~ $ find ~/ -name "node" -ls
125874    4 drwxr-xr-x   2 pi       pi           4096 Mar  4 09:40 /home/pi/.nvm/test/installation/node
129143    4 drwxr-xr-x   3 pi       pi           4096 Mar  4 09:43 /home/pi/.nvm/versions/node
128984    4 drwxr-xr-x   2 pi       pi           4096 Mar  3 07:16 /home/pi/.nvm/versions/node/v5.7.1/share/doc/node
128988 22080 -rwxr-xr-x   1 pi       pi       22608862 Mar  3 07:16 /home/pi/.nvm/versions/node/v5.7.1/bin/node
128992    4 drwxr-xr-x   4 pi       pi           4096 Mar  3 07:17 /home/pi/.nvm/versions/node/v5.7.1/include/node

pi@raspberrypi:~ $ find ~/ -name "nvm.sh" -ls
124544   72 -rwxr-xr-x   1 pi       pi          72916 Mar  4 09:40 /home/pi/.nvm/nvm.sh

よし、次はnpmのインストールだ!と意気込んだのですが、既にインストール済みでした。nodeと一緒にはいるのですね。osxでインストーラーを実行した時みたい。

pi@raspberrypi:~ $ npm

Usage: npm <command>

where <command> is one of:
    access, add-user, adduser, apihelp, author, bin, bugs, c,
    cache, completion, config, ddp, dedupe, deprecate, dist-tag,
    dist-tags, docs, edit, explore, faq, find, find-dupes, get,
    help, help-search, home, i, info, init, install,
    install-test, issues, it, la, link, list, ll, ln, login,
    logout, ls, outdated, owner, pack, ping, prefix, prune,
    publish, r, rb, rebuild, remove, repo, restart, rm, root,
    run-script, s, se, search, set, show, shrinkwrap, star,
    stars, start, stop, t, tag, team, test, tst, un, uninstall,
    unlink, unpublish, unstar, up, update, upgrade, v, verison,
    version, view, whoami

npm <cmd> -h     quick help on <cmd>
npm -l           display full usage info
npm faq          commonly asked questions
npm help <term>  search for help on <term>
npm help npm     involved overview

Specify configs in the ini-formatted file:
    /home/pi/.npmrc
or on the command line via: npm <command> --key value
Config info can be viewed via: npm help config

npm@3.6.0 /home/pi/.nvm/versions/node/v5.7.1/lib/node_modules/npm
pi@raspberrypi:~ $ npm --version
3.6.0

あまりにもすんなり行きすぎて何か寂しい感じがします。もっと苦戦しないと記事にする意味がないなー。

(2016/03/05追記)

早速ですが困ったことが発生してくれました(??)ので、追記です。上記の方法でインストールすると、nvmが/home/piにインストールされて、nodeはその配下にインストールされます。が、これだとsudoで使用する事ができません。これができないとハードウェアアクセスが必要なモジュールを使ったり、ウェルノウンポートをリスンさせられなくなります。

pi@raspberrypi:~ $ sudo nvm
sudo: nvm: command not found

スーパーユーザーの環境変数にpiへのパスを追加してもいいのだと思いますが、非特権ユーザーへのパスを通すのもなんだかおかしな感じです。そこでグローバルにnvmをインストールしてみることにしました。同じ事を考える人はいるもので、パッケージ化してくれています。

GitHub – xtuple/nvm: Easily setup NVM globally for rooted, multi-user, or CI environments

pi@raspberrypi:~ $ wget -qO- https://raw.githubusercontent.com/xtuple/nvm/master/install.sh | sudo bash
Cloning into '/usr/local/nvm'...
remote: Counting objects: 826, done.
remote: Total 826 (delta 0), reused 0 (delta 0), pack-reused 826
Receiving objects: 100% (826/826), 141.80 KiB | 26.00 KiB/s, done.
Resolving deltas: 100% (387/387), done.
Checking connectivity... done.
NVM installed

pi@raspberrypi:~ $ sudo nvm

Node Version Manager

Usage:
    nvm help                    Show this message
    nvm install [-s] <version>  Download and install a <version>
    nvm uninstall <version>     Uninstall a version
    nvm use <version>           Modify PATH to use <version>
    nvm run <version> [<args>]  Run <version> with <args> as arguments
    nvm ls                      List installed versions
    nvm ls <version>            List versions matching a given description
    nvm ls-remote               List remote versions available for install
    nvm deactivate              Undo effects of NVM on current shell
    nvm alias [<pattern>]       Show all aliases beginning with <pattern>
    nvm alias <name> <version>  Set an alias named <name> pointing to <version>
    nvm unalias <name>          Deletes the alias named <name>
    nvm copy-packages <version> Install global NPM packages contained in <version> to current version

Example:
    nvm install v0.4.12         Install a specific version number
    nvm use 0.2                 Use the latest available 0.2.x release
    nvm run 0.4.12 myApp.js     Run myApp.js using node v0.4.12
    nvm alias default 0.4       Auto use the latest installed v0.4.x version

早速これを使ってインストール。sudoでnode呼べました。

pi@raspberrypi:~ $ sudo nvm install v5
######################################################################## 100.0%
Checksums empty
Now using node v5.7.1
pi@raspberrypi:~ $ ls
init-functions  kt  node_modules  ts  wiringPi
pi@raspberrypi:~ $ ls -laF
total 100
drwxr-xr-x   8 pi   pi    4096 Mar  5 09:10 ./
drwxr-xr-x   3 root root  4096 Feb  2 20:52 ../
-rw-------   1 pi   pi   20462 Mar  5 09:05 .bash_history
-rw-r--r--   1 pi   pi     220 Mar  4 17:42 .bash_logout
-rw-r--r--   1 pi   pi    3610 Mar  4 17:42 .bashrc
drwx------   3 pi   pi    4096 Mar  5 08:43 .config/
-rw-r--r--   1 pi   pi    6148 Mar  5 07:19 .DS_Store
-rw-r--r--   1 pi   pi     362 Mar  4 17:42 .ftpconfig
-rwxr-xr-x   1 pi   pi   11506 Mar  4 17:44 init-functions*
drwxr-xr-x   3 pi   pi    4096 Feb 11 22:54 kt/
drwxr-xr-x   2 pi   pi    4096 Mar  5 08:38 node_modules/
-rw-r--r--   1 pi   pi      27 Mar  4 17:42 .node_repl_history
drwxr-xr-x 253 pi   pi   12288 Mar  5 08:42 .npm/
-rw-r--r--   1 pi   pi     675 Mar  4 17:44 .profile
drwxr-xr-x   4 pi   pi    4096 Mar  5 08:46 ts/
drwxr-xr-x  10 pi   pi    4096 Feb 11 11:43 wiringPi/

pi@raspberrypi:~ $ node -v
v5.7.1
pi@raspberrypi:~ $ sudo node -v
v5.7.1

(2016/03/05 更に問題発生で更に追記)

npmでインストールしたコマンド(ここではtypings)を実行しようとしたら、not foundになりました。ユーザー領域にインストールした場合には最初からパスが通っていたのですが、グローバルインストールだと自分で設定しないといけないようです。piのために設定する場合はこのとおり。

pi@raspberrypi:~ $ export PATH=$PATH:`npm bin -g`
(not in PATH env variable)
pi@raspberrypi:~ $ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/games:/usr/games:/usr/local/nvm/v5.7.1/bin
pi@raspberrypi:~ $ typings

Usage: typings <command>

Commands:
    bundle, i, in, init, install, la, list, ll, ls, r, remove, rm, search,
    uninstall

typings <command> -h            Get help for <command>
typings <command> --no-insight  Disable insights for <command>

typings --version               Print the CLI version
typings --cache                 Print the path to the cache directory

typings@0.6.9 /usr/local/nvm/v5.7.1/lib/node_modules/typings

ただこれだとログアウトする度に消えてしまうので、/etc/profileに追記します。

pi@raspberrypi:~ $ sudo nano /etc/profile

途中の所のパスの設定部分でもいいと思いますが、追記したことがわかりやすいように末尾にしました。

PATH=$PATH:/usr/local/nvm/v5.7.1/bin
export PATH

root用はこちら。exportで追加する方法が分かりませんでした。visudoでnanoが起動するので追記します。

pi@raspberrypi:~ $ sudo visudo
pi@raspberrypi:~ $ sudo sh -c 'echo $PATH'
/usr/local/nvm/v5.7.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
pi@raspberrypi:~ $ sudo typings

Usage: typings <command>

Commands:
    bundle, i, in, init, install, la, list, ll, ls, r, remove, rm, search,
    uninstall

typings <command> -h            Get help for <command>
typings <command> --no-insight  Disable insights for <command>

typings --version               Print the CLI version
typings --cache                 Print the path to the cache directory

typings@0.6.9 /usr/local/nvm/v5.7.1/lib/node_modules/typings

visudoではsecure_pathのところにパスを追記しています。

#
# This file MUST be edited with the 'visudo' command as root.
#
# Please consider adding local content in /etc/sudoers.d/ instead of
# directly modifying this file.
#
# See the man page for details on how to write a sudoers file.
#
Defaults        env_reset
Defaults        mail_badpass
Defaults        secure_path="/usr/local/nvm/v5.7.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"

 

 

 

 

 


Facebooktwitterpinterestlinkedinmail
納得したらすぐにシェア!