macOS標準Vimでvimproc実行時に署名エラーが発生する問題の回避方法

## 背景

Vimを愛用していて、そこそこプラグイン入れる派です。
プラグイン管理は長らく[NeoBundle](https://github.com/Shougo/neobundle.vim) + [vimproc](https://github.com/Shougo/vimproc.vim)にお世話になっています。
先日、久々にMac上のVimで`:NeoBundleUpdate`を実行したところ、エラーが出て動かなくなってしまいました。
回避方法を見つけるまで結構時間を使ってしまったので、記事にしておきたいと思います。

## エラーが発生した環境

  - macOS Mojave (10.14.1)
  - Vim 8.0, macOS標準のwithout GUI版

High Sierraでは問題なかったと思いますが、自信がありません。。。
Sierraでは間違いなく問題ありませんでした。
他に心当たりが全くないので、OSアップグレードが引き金だろうと推測。

## エラー内容

```shell-session:エラーメッセージ全文
[vimproc] function neobundle#commands#install[40]..<SNR>17_install[21]..neobundle#installer#sync[51]..neobundle#installer#get_revision_number[17]..neobundle#util#system[7]..vimproc#
system[25]..<SNR>83_system[10]..vimproc#pgroup_open[15]..<SNR>83_pgroup_open[7]..vimproc#plineopen3[6]..<SNR>83_plineopen[64]..<SNR>83_vp_pipe_open[10]..<SNR>83_libcall, line 1
[vimproc] Vim(let):dlerror = "dlopen(/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so, 0x0005): code signature in (/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed."
[vimproc] Error occurred in calling s:vp_pipe_open()
[vimproc] a:argv = ['/usr/bin/git', 'rev-parse', 'HEAD']
[vimproc] original a:argv = ['/usr/bin/git', 'rev-parse', 'HEAD']
[vimproc] Vim(if):E121: Undefined variable: fdlist
[vimproc] function neobundle#commands#install[40]..<SNR>17_install[21]..neobundle#installer#sync[70]..neobundle#installer#lock_revision[5]..neobundle#installer#get_revision_number[1
7]..neobundle#util#system[7]..vimproc#system[25]..<SNR>83_system[10]..vimproc#pgroup_open[15]..<SNR>83_pgroup_open[7]..vimproc#plineopen3[6]..<SNR>83_plineopen[64]..<SNR>83_vp_pipe_
open[10]..<SNR>83_libcall, line 1
[vimproc] Vim(let):dlerror = "dlopen(/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so, 0x0005): code signature in (/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed."
[vimproc] Error occurred in calling s:vp_pipe_open()
[vimproc] a:argv = ['/usr/bin/git', 'rev-parse', 'HEAD']
[vimproc] original a:argv = ['/usr/bin/git', 'rev-parse', 'HEAD']
[vimproc] Vim(if):E121: Undefined variable: fdlist
[vimproc] function neobundle#commands#install[40]..<SNR>17_install[21]..neobundle#installer#sync[86]..vimproc#pgroup_open[15]..<SNR>83_pgroup_open[7]..vimproc#plineopen2[6]..<SNR>83
_plineopen[64]..<SNR>83_vp_pipe_open[10]..<SNR>83_libcall, line 1
[vimproc] Vim(let):dlerror = "dlopen(/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so, 0x0005): code signature in (/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed."
[vimproc] Error occurred in calling s:vp_pipe_open()
[vimproc] a:argv = ['/usr/bin/git', 'pull', '--ff', '--ff-only']
[vimproc] original a:argv = ['/usr/bin/git', 'pull', '--ff', '--ff-only']
Error detected while processing function neobundle#commands#install[40]..<SNR>17_install[21]..neobundle#installer#sync[86]..vimproc#pgroup_open[15]..<SNR>83_pgroup_open[7]..vimproc#
plineopen2[6]..<SNR>83_plineopen[64]..<SNR>83_vp_pipe_open:
line   25:
E121: Undefined variable: fdlist
E116: Invalid arguments for function len(fdlist)
E15: Invalid expression: a:npipe != len(fdlist)
```

たくさん出ていますが、大事そうなのは以下。

```shell-session:エラーメッセージ抜粋
[vimproc] Vim(let):dlerror = "dlopen(/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so, 0x0005): code signature in (/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so
) not valid for use in process: mapped file has no cdhash, completely unsigned? Code has to be at least ad-hoc signed."
```

`vimproc_mac.so`が署名されていないことが原因、ということでしょう。
色々調べた結果、以下の記事が参考になりました。

[Mac標準のApacheにhomebrewでインストールしたPHPモジュールを指定するとエラーになる問題の解決方法](https://qiita.com/rryu/items/6968c1d5b3fe223b0eed)

今回の現象に当てはめると、macOSのアップグレードでOS標準のVimが署名されたものになり、署名されていない`vimproc_mac.so`を呼んだ時にエラーが発生するようになった、と類推できます。

## 署名を確認してみる

まずmacOS標準Vim。

```shell-session:macOS標準Vimの署名確認
$ codesign -vd /usr/bin/vim
Executable=/usr/bin/vim
Identifier=com.apple.vim
Format=Mach-O thin (x86_64)
CodeDirectory v=20100 size=14558 flags=0x0(none) hashes=451+2 location=embedded
Platform identifier=5
Signature size=4485
Info.plist=not bound
TeamIdentifier=not set
Sealed Resources=none
Internal requirements count=1 size=64
```

署名されています。

続いて、一応`vimproc_mac.so`も。

```shell-session:vimproc_mac.soの署名確認
$ codesign -vd ~/.vim/bundle/vimproc.vim/lib/vimproc_mac.so 
/Users/hrnrhty/.vim/bundle/vimproc.vim/lib/vimproc_mac.so: code object is not signed at all
```

エラーメッセージに書いてあったので当然ですが、やはり署名されていません。
`vimproc_mac.so`に署名するのが最も良い方法のように思いますが、これはGitHubから取得したソースをローカルでビルドしたもの。この場合どのように署名すべきなのか、よくわかりません。。。

## 回避方法

再び先の記事を参考にすると、署名されていないもの同士であればエラーは発生せず、また、HomebrewのVimは署名されていない可能性が高そうです。
インストールしてみます。

```shell-session:Homebrew版Vimインストール
$ brew update
$ brew install vim --with-override-system-vi
```

これで、単に`vim`と叩けばHomebrew版Vimが起動するようになります。

続いて、署名を確認してみます。

```shell-session:Homebrew版Vimの署名確認
$ codesign -vd /usr/local/bin/vim
/usr/local/bin/vim: code object is not signed at all
```

ナイス！署名されていません、期待通りです。

Vimを起動して`:NeoBundleUpdate`してみると、無事エラーは発生しなくなりました。