Proxy下のWindows版Atomでscriptパッケージがインストールできない問題


## はじめに

私の端末はHTTP及びHTTPS以外は通さないプロクシを通さなければ外部に出ることが出来ない。
基本的にはHTTPとHTTPSで事足りるのだが、今回このプロクシのせいで`script`パッケージがインストールできなくなってしまった。
恐らく私と同じような問題に悩む方はそう多くはないと思うが、日本語で情報を残す。

**2016/04/13 Update**

正しい解決方法が判明したので編集した。

## 前提条件

- Windows 7 32bit版
- Atom 1.6.2
- HTTP及びHTTPS以外を通さないプロクシが立ちはだかっている
- `git`インストール済み
- 環境変数`HOME`を`USERPROFILE`と別の場所に設定 ← **非常に重要**

## 発生した問題

```shell-session
$ apm install script
Installing script to C:\Users\fkfk\.atom\packages failed

npm WARN addRemoteGit Error: Command failed:
npm WARN addRemoteGit     at ChildProcess.exithandler (child_process.js:658:15)
npm WARN addRemoteGit     at ChildProcess.emit (events.js:98:17)
npm WARN addRemoteGit     at maybeClose (child_process.js:766:16)
npm WARN addRemoteGit     at Process.ChildProcess._handle.onexit (child_process.js:833:5)
npm WARN addRemoteGit  git://github.com/monsterkodi/node-simple-plist.git resetting remote C:\Users\fkfk\.atom\.apm\_git-remotes\git-github-com-monsterkodi-node-simple-plist-git-6a71a541 because of error: { [Error: Command failed: ] killed: false, code: 1, signal: null }
npm ERR! git clone --template=C:\Users\fkfk\.atom\.apm\_git-remotes\_templates --mirror git://github.com/monsterkodi/node-simple-plist.git C:\Users\fkfk\.atom\.apm\_git-remotes\git-github-com-monsterkodi-node-simple-plist-git-6a71a541: Cloning into bare repository 'C:\Users\fkfk\.atom\.apm\_git-remotes\git-github-com-monsterkodi-node-simple-plist-git-6a71a541'...
npm ERR! git clone --template=C:\Users\fkfk\.atom\.apm\_git-remotes\_templates --mirror git://github.com/monsterkodi/node-simple-plist.git C:\Users\fkfk\.atom\.apm\_git-remotes\git-github-com-monsterkodi-node-simple-plist-git-6a71a541: fatal: Unable to look up github.com (port 9418) (Temporary failure in name resolution)
npm ERR! Windows_NT 6.1.7601
npm ERR! argv "D:\\opt\\Atom\\resources\\app\\apm\\bin\\node.exe" "D:\\opt\\Atom\\resources\\app\\apm\\node_modules\\npm\\bin\\npm-cli.js" "--globalconfig" "C:\\Users\\fkfk\\.atom\\.apm\\.apmrc" "--userconfig" "C:\\Users\\fkfk\\.atom\\.apmrc" "install" "D:\\opt\\msys32\\tmp\\d-116311-2396-15dz5pn\\package.tgz" "--target=0.34.5" "--arch=ia32"
npm ERR! node v0.10.40
npm ERR! npm  v2.13.3
npm ERR! code 128

npm ERR! Command failed: Cloning into bare repository 'C:\Users\fkfk\.atom\.apm\_git-remotes\git-github-com-monsterkodi-node-simple-plist-git-6a71a541'...
npm ERR! fatal: Unable to look up github.com (port 9418) (Temporary failure in name resolution)
npm ERR!
npm ERR!
npm ERR! If you need help, you may report this error at:
npm ERR!     <https://github.com/npm/npm/issues>
```

要は`git://`でアクセスしようとして失敗している。

## `git config`でどうにかしようと試みる

`git://`でアクセスしようとするのが悪いのだから、これを`http://`なり`https://`なりに読み替えれば問題なくなるはずである。

```shell-session
$ git config --global url."https://".insteadOf git://
```

これで問題ないはずと思い、おもむろに`apm install script`を実行すると先ほどと同じエラーが発生してしまった。
念のため`git://`なリポジトリを`git clone`してみたが正常に取得出来たので、`git`そのものは正しく動いているようだ。

## Linuxで試してみる

調べてみても前段の`git config`をすれば解決しているIssueしか見つけられずしばらく頭を抱えていたのだが、ふとLinuxで試すとどうなるかと思いやってみた。
LinuxにはAtomをインストールしていないので`npm`でやってみることにする。

```shell-session
$ git clone https://github.com/rgbkrk/atom-script.git
$ cd atom-script
$ npm install --save
(snip)
$
```

なんと正常に通ってしまった。
念のため同一操作をWindows上の`nyagos`、`cmd.exe`、`bash`(MsysGIT)、`zsh`(msys2)で試してみたがどれも通らなかったので、どうやら`npm`のWindows固有のバグのようである。

## `.gitconfig`の場所を確認する(2016/04/13追記)

`git config --global`とした場合、LinuxやMacの場合は`$HOME/.gitconfig`に記録される。
Windowsだと、`nyagos`や`cmd.exe`、`bash`等で実行した場合に環境変数`HOME`が定義されていればそちらを見に行くが、なければ`USERPROFILE`の値を`HOME`として利用する。
しかし、`npm`から実行される場合、環境変数`HOME`を考慮せずに`%USERPROFILE%\.gitconfig`を見に行ってしまう。
そのため、`git config --global`で読み替えの設定を行っていたとしても、`npm`内部で`git clone`を行うときにはそもそも`.gitconfig`を読まないのでこのような問題が発生するようだ。
解決方法としては

1. 環境変数`HOME`を消す
2. 環境変数`HOME`と`USERPROFILE`を同一の値にする
3. `%USERPROFILE%\.gitconfig`に`%HOME%\.gitconfig`のシンボリックリンクまたはハードリンクを作成する

のどれかとなるが、私は1と2の対応は論外なので3で対応したいところである。
が、Windowsでシンボリックリンクを作成するには管理者権限または特権`SeCreateSymbolicLinkPrivilege`が必要となるが、残念ながら私のユーザーにはどちらも設定されていない。
また、ハードリンクを作成しようにも環境変数`HOME`は`USERPROFILE`と別ドライブにしているためこれも不可となる。
どうしようもないので、取り急ぎ`%HOME%\.gitconfig`を`%USERPROFILE%\.gitconfig`にコピーすることにした。
`.gitconfig`が更新されたら都度コピーするように何かしら行わなければならないが、今更`HOME`の値を変更するよりはマシだろう。

**さらに追記**

`npm`でのみ試して`apm`を試していなかったので先ほどやってみたのだが、`apm`でやると見事にエラーが出てしまうことが分かった。
恐らく内部の`npm`のバージョンが古いのが問題なのだろうと思うが、結局下記の方法でやるほかないようだ。

```shell-session
$ cp $HOME/.gitconfig $USERPROFILE/.gitconfig
$ cd /path/to/dir
$ git clone https://github.com/rgbkrk/atom-script.git
$ cd atom-script
$ git checkout -b v3.6.3 refs/tags/v3.6.3 # リリース版を使いたい場合
$ npm install
$ apm link
```

これでもLinuxで`git clone`及び`npm install`をしなくてもよくなった分いくらかマシである。

## やっつけ対応

### `apm link`でひとまず利用できるようにする

バグの原因を探るほうが建設的だが、`script`が利用できないのは致命的なので取り急ぎLinux上で`npm install`が通ったディレクトリをまるまるWindowsに持ってきてみた。

```shell-session
$ cd /path/to/atom-script
$ apm link
```

`node-gyp`でコンパイルしたものが混じっていればアウトだが、運よくそのようなものは混じっていなかったようで今のところ正常に利用できている。

### 付録: 別ブランチを切って`packages.json`を修正する

今回私がやった方法はWindows以外の端末がある(またはVM等でLinuxを利用できる)ことが前提だが、`atom-script`及び問題となるパッケージに依存しているものを根こそぎローカルにcloneし、`packages.json`を修正する手もある。
修正が必要となるパッケージは以下の通り。

- [atom-script](https://github.com/rgbkrk/atom-script)
- [ansi-to-html](https://github.com/rburns/ansi-to-html)
- [karg](https://github.com/monsterkodi/karg)
- [noon](https://github.com/monsterkodi/noon)

`noon`パッケージが依存している`simple-plist`の指定が`git://`となっているため、これを`https://`に修正し、それ以外の`packages.json`を`file://`で指定すれば動くはずである。
アップデートのたびにそれぞれのリポジトリの更新を追ってマージするのが非常に面倒と感じたため、私はこの方法は試してもいない。