OSS版VSCodeをビルドする

## 目的

ネットワーク上の問題でオフィシャル版VSCodeのアップデートができなくなったため、OSS版をビルドして使うことにした。


## 環境と準備

- proxy内にいる
  - 環境変数 `HTTPS_PROXY` `HTTP_PROXY` 定義済
  - `set NODE_TLS_REJECT_UNAUTHORIZED=0` 必須

- PC
  - Windows 7 Professional 32bit
  - Core i3-3120M 2.5GHZ (IvyBridge)
  - RAM 4.00GB
  - この環境で、yarnの実行から実行ファイルができるまで、何もトラブルが起きなければ3時間程かかる

- node 8.11.3 (8.9.1以上9.0.0未満)
  - 参照 https://github.com/Microsoft/vscode/wiki/How-to-Contribute
  - nodistでインストールしておく

- (次回からは必要ないはずだが) `npm install -g windows-build-tools`
  - 自分の環境では失敗する(powershellでないから？) 
  - `%USERPROFILE%\.windows-build-tools\BuildTools_Full.exe` がダウンロードされているのでそれを直接実行してインストールした
    - windows-build-toolsのpython 2.7は入れなかった(condaで入れたいので)

- githubから`vscode-master.zip`をダウンロードして解凍しておく


## conda で python 2.7 環境を作る

`node-gyp`のために必要。
condaが少し古かったので最初にcondaをアップデートしている。
--no-depsはconda-forgeから入ったqtのバージョンを下げないため。

```
conda info -e 
conda update -n base conda --no-deps
conda create -n py27 python=2.7
conda info -e
# conda environments:
#
base                  *  C:\Users\______\AppData\Local\Continuum\Miniconda3
py27                     C:\Users\______\AppData\Local\Continuum\Miniconda3\envs\py27
```

## yarnおよび各種パッケージの取得

node-gypがちゃんと動けばすんなり進むはず。 

```
cd vscode-master
activate py27
npm install -g yarn

npm config set msvs_version 2015
npm config set python C:/Users/______/AppData/Local/Continuum/Miniconda3/envs/py27/python.exe

set NODE_TLS_REJECT_UNAUTHORIZED=0
yarn
```


## product.jsonにextensionsGalleryのURLを追加する

これがないと機能拡張をインストールできない。
実行ファイル名に空白が入る(`Code - oss.exe`)のが嫌なので関係しそうなnameも変更している。この設定では`CodeOSS.exe`ができる。
`dataFolderName`は機能拡張の保存フォルダ(`%USERPROFILE%\.vscode-oss`)で、 `settings.json`や`locale.json`は`%USERPROFILE%\AppData\Roaming\CodeOSS\User`に保存される。
`extensionAllowedProposedApi`を削除してしまうとnodeのデバッグができなくなる。

```json:product.json
{
    "nameShort": "CodeOSS",
    "nameLong": "CodeOSS",
    "applicationName": "code-oss",
    "dataFolderName": ".vscode-oss",
    "win32MutexName": "vscodeoss",
    "licenseName": "MIT",
    "licenseUrl": "https://github.com/Microsoft/vscode/blob/master/LICENSE.txt",
    "win32DirName": "Microsoft Code OSS",
    "win32NameVersion": "Microsoft Code OSS",
    "win32RegValueName": "CodeOSS",
    "win32AppId": "{{E34003BB-9E10-4501-8C11-BE3FAA83F23F}",
    "win32x64AppId": "{{D77B7E06-80BA-4137-BCF4-654B95CCEBC5}",
    "win32UserAppId": "{{C6065F05-9603-4FC4-8101-B9781A25D88E}",
    "win32x64UserAppId": "{{C6065F05-9603-4FC4-8101-B9781A25D88E}",
    "win32AppUserModelId": "Microsoft.CodeOSS",
    "win32ShellNameShort": "C&odeOSS",
    "darwinBundleIdentifier": "com.visualstudio.code.oss",
    "reportIssueUrl": "https://github.com/Microsoft/vscode/issues/new",
    "urlProtocol": "code-oss",
    "extensionAllowedProposedApi": [
        "ms-vscode.node-debug",
        "ms-vscode.node-debug2"
    ],
    "extensionsGallery": {
        "serviceUrl": "https://marketplace.visualstudio.com/_apis/public/gallery",
        "cacheUrl": "https://vscode.blob.core.windows.net/gallery/index",
        "itemUrl": "https://marketplace.visualstudio.com/items"
    }
}
```



## ビルドする

`vscode-master`の親フォルダにできる`VSCode-win32-ia32`というフォルダが成果物になる。  

```
yarn run gulp vscode-win32-ia32-min
yarn run v1.7.0
$ gulp --max_old_space_size=4095 vscode-win32-ia32-min
[11:09:42] Node flags detected: --max_old_space_size=4095
[11:09:42] Respawned to PID: 7776
[11:10:46] Using gulpfile ~\Downloads\vscode-master\vscode-master\gulpfile.js
[11:10:46] Starting 'clean-minified-vscode'...
(中略)
CSS INLINING IMAGE AT out-build\vs\workbench\parts\welcome\code-icon.svg MORE
THAN ONCE. CONSIDER CONSOLIDATING CSS RULES
[12:06:07] Finished 'optimize-vscode' after 8.08 min
[12:06:07] Starting 'optimize-index-js'...
[12:06:08] Finished 'optimize-index-js' after 733 ms
[12:06:08] Starting 'minify-vscode'...
[12:33:19] Finished 'minify-vscode' after 27 min
[12:33:19] Starting 'vscode-win32-ia32-min'...
[12:37:22] Downloading extension: ms-vscode.node-debug2@1.27.0 ...
[12:37:32] Downloading extension: ms-vscode.node-debug@1.27.1 ...
↓ ffmpeg-v2.0.7-win32-ia32.zip [====================] 100%
↓ electron-v2.0.7-win32-ia32.zip [====================] 100%
[12:41:59] Finished 'vscode-win32-ia32-min' after 8.65 min
Done in 5547.40s.
```

`CodeOSS.exe`の`Help -> About`の出力(Dateは参考)

```
Version: 1.27.0
Commit: Unknown
Date: 2018-08-15T00:00:00.000Z
Electron: 2.0.7
Chrome: 61.0.3163.100
Node.js: 8.9.3
V8: 6.1.534.41
Architecture: ia32
```

## Downloading extensionの途中でproxyを越えられずにエラーで終了した場合

最初からやり直すのは面倒なので、`build\gulpfile.vscode.js`を変更してタスクを定義する。
`gulp.task('package-win32-ia32-min', packageTask('win32', 'ia32', { minified: true }));` 等と書き足し、下記の様に実行する。

```
set NODE_TLS_REJECT_UNAUTHORIZED=0
yarn run gulp package-win32-ia32-min
yarn run v1.7.0
$ gulp --max_old_space_size=4095 package-win32-ia32-min
[16:12:00] Node flags detected: --max_old_space_size=4095
[16:12:00] Respawned to PID: 11776
[16:12:08] Using gulpfile ~\Downloads\vscode-master\vscode-master\gulpfile.js
[16:12:08] Starting 'package-win32-ia32-min'...
[16:14:47] Downloading extension: ms-vscode.node-debug2@1.26.0 ...
[16:14:51] Downloading extension: ms-vscode.node-debug@1.26.0 ...
↓ ffmpeg-v1.7.12-win32-ia32.zip [====================] 100%
↓ electron-v1.7.12-win32-ia32.zip [====================] 100%
[16:18:10] Finished 'package-win32-ia32-min' after 6.02 min
Done in 371.65s.
```


## メモ

- gulpのタスクリストは `yarn run gulp --tasks` で確認できる
- 日本語化のため `Japanese Language Pack for Visual Studio Code` をインストールして `locale.json` に `"locale": "ja"` として再起動してもメニューなどは英語のままになる
  - 日本語になる部分もあるのでlocaleそのものは認識されている？