Node開発環境 on SSHターミナル

# SSHターミナルでの開発
私のメインの開発環境は、iPad+GCPのCentOSのインスタンス。これは何を意味するかというと、SSHターミナル上で開発をするということ。IDEを使わないってことでもある。Nodeの開発環境も整ってきたのでそろそろ整理。

# 概要
正直古くさい構成だけどそんなに困ってない。

- セッション維持、マルチウィンドウ: screen
- 版管理: git 2+, Google クラウド ソース レポジトリ
- エディタ: vim 8+
   - ALE
   - NerdTree
- Nodeランタイム管理: nvm
- リンタ: eslint (ALE連携、AirBnBのコーディング規約)
- テスト: jest

SSHログインして、`screen -r`で開発開始。一つ目のウィンドウにはbashが立ち上がっており、もう一つのウィンドウはvimが立ち上がっている。bashのウィンドウの方は`npm test`でテストしたり、NodeのREPLで動作確認したり、`git`などを打つために開いている。Vimの方は、ファイルエクスプローラ機能（NerdTree)と、非同期リンタ連携(ALE)をつける。
バックアップ兼版管理にはgitを使う。無料のプライベートレポジトリとしてGCPを使う関係上、gitの認証機能を`gcloud`コマンドと連携する必要があるため、Gitのバージョンは2以上でないといけない。

CentOS 7 での手順。docker の centos イメージで手順を確認。

# vim + ALE + NERDTree
まずは Vim。ALEを使うためにはVim 8+が必要なのでソースからビルド。Githubの [VimのReleaseページ](https://github.com/vim/vim/releases) からtarballをダウンロードして展開して、`make;make install`すると `/usr/local/bin/vim` にインストールされる。パスを通せば使えるようになるが、そのままだと色もつかない不便なvimなので `/usr/local/share/vim/vim80/vimrc_example.vim` をベースにするのが良い。あと、Vim8から、マウス右クリックで貼り付けがデフォルトでできなくなった。`set mouse-=a`をvimrcに追加しておくといいかも。

```sh
# build libs
yum -y install which sudo wget
yum -y groupinstall 'Development Tools'
yum -y install ncurses-devel
# install to /usr/local
make
make install
# setup
echo 'export PATH=/usr/local/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
cp /usr/local/share/vim/vim80/vimrc_example.vim ~/.vimrc
```

VimにNerdTreeとALSを導入しよう。Vim8になって本体にプラグインインストール機構が入ったみたいなんだけど、調べるのもめんどくさいので従来通りVundleで管理する。`~./vimrc` に指定されたおまじないを書いて、vimを起動して `:PluginInstall` ってやると入るので、`scrooloose/nerdtree` と `w0rp/ale` をインストールするように指示。


```sh
git clone https://github.com/VundleVim/Vundle.vim.git \
~/.vim/bundle/Vundle.vim
```

```vimrc追加分.vim
""" Vundle
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree'
Plugin 'w0rp/ale'
call vundle#end()
filetype plugin indent on
""" /Vundle
```

NERDTreeもALSも特に設定を`~/.vimrc`に一切設定を書かなくても動くけど、カスタマイズしたい人はしてもいいかも。

最後に自分用に`~/.vimrc`を載せておく。

```さらに追加.vim
set mouse-=a
set ts=2
set sw=2
set smartindent
set nobackup
set expandtab
```

# nvm + node

Nodeは直接インストールしない。nvmを使おう。nvmの githubページに行くと nvmの1行インストール方法が書いてあるので、それに従う。`.bashrc`をいじくられるので再度sourceして、`nvm install node`とやれば使えるようになる。

```sh
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
. ~/.bashrc #nvm installer changes .bashrc so source it again.
nvm install node
```

これで準備完了


# プロジェクト作成

`~/sandbox`をプロジェクトディレクトリにする。プロジェクトディレクトリで、`npm init -y`でpackage.jsonができる。`npm i --save-dev eslint jest`でリンタ、テストツールがインストールされる。`eslint --init`をして、対話的に設定をすることで`Airbnb`のコーディングスタイルを適用するよう設定して`.eslintrc`が作成されたことを確認する。

ここでクイックハック。vim(というかALS) が eslint を見つけてあげられるようにパスを通す。編集したらsourceしよう。これでeslintの設定は終わり。

```sh
echo 'export PATH="$HOME/sandbox/node_modules/eslint/bin/":$PATH' >> ~/.bashrc
source ~/.bashrc
```

jestの設定としては、`package.json` を少し書き換えて`npm test` で実行できるようにしておく。

```package.json
...前略
  "scripts": {
    "test": "jest"
  },
...後略
```

あと、テストコード書いているときに `test, expect` が定義されてないぞ、とALEが怒るので私はテストコードにlintは仕掛けてない。これはどうすればいいのかなあ、と思案中。

```vimrcさらに追加.vim
let g:ale_pattern_options = {
\ '\.test\.js$': {'ale_linters': [], 'ale_fixers': []},
\}
```

# その他 (screen, git, gcloud)

screen は yumで入る。 

```
yum -y install screen
```

git は github のページからtarballをダウンロードして、prefixつきでmake, make install する。パスを通してあげればOK。

```
yum -y install expat-devel gettext-devel openssl-devel zlib-devel perl-ExtUtils-MakeMaker
make prefix=/usr/local/git all
make prefix=/usr/local/git install
#path
echo 'export PATH=/usr/local/git/bin:$PATH' >> ~/.bashrc
. ~/.bashrc
```

gcloud は以下で導入。

```
curl https://sdk.cloud.google.com | bash
. ~/.bashrc
gcloud init
```

1回cloneしてしまえばあとは普通のgitとして使える。

```
gcloud source repos clone myapp
```