ペペロン頭脳

ソフトウェアエンジニアのメモ的なアレ。

Windows版 Sublime Text 3向けにPackage Control 3.0.0がリリースされたけどアップグレード失敗する人へ

はい。タイトル通りです。
Windowsかつプロキシ環境下で使ってる方で、アップグレードに失敗する方がそこそこいるのではないかと思い、ここに記す次第です。

ワンライナーに手を加える

本日(昨日?)ST3起動したらこんなメッセージ出たよね。
wbondサンタさんからのプレゼントだ!ヤッター!!

**** Windows Sublime Text 3 Users ****

Due to a bug in Package Control 2.0, Windows ST3 users will need to open the
Sublime Text console (ctrl+`) and execute the following Python to properly
upgrade. All other users may ignore this part of the message.

Make sure NOT to copy the leading two spaces, or an "unexpected indent" error
will occur.

【以下インストール用ワンライナーが続く】

import urllib.request,os; pr='Preferences.sublime-settings'; ip='ignored_packages'; n='Package Control'; s=sublime.load_settings(pr); ig=s.get(ip); ig.append(n); s.set(ip,ig); sublime.save_settings('Preferences.sublime-settings'); pf=n+'.sublime-package'; urllib.request.install_opener(urllib.request.build_opener(urllib.request.ProxyHandler())); by=urllib.request.urlopen('https://packagecontrol.io/'+pf.replace(' ','%20')).read(); open(os.path.join(sublime.installed_packages_path(),pf),'wb').write(by); ig.remove(n); s.set(ip,ig); sublime.save_settings(pr); print('Package Control: 3.0.0 upgrade successful!')

プロキシサーバを通過させるためにワンライナーに手を加えてやるのですが、今回のアップグレードではpackagecontrol.ioへの接続にhttpではなくhttpsを使うよう変更されています。
というわけで、httpのみを指定していると通信に失敗します。下記のように、ProxyHandlerでの設定もhttpsに合わせてやる必要があります。

# urllib.request.ProxyHandler()に対し、引数を下記のように指定
urllib.request.ProxyHandler({'https': 'http://[username]:[password]@[host]:[port]'})
# もしくは
urllib.request.ProxyHandler({'https': 'https://[username]:[password]@[host]:[port]'})

あるいは、"https://packagecontrol.io"の箇所をhttpに書き換えちゃっても通るかと思います。
ユーザー認証が必要ない環境では、"[username]:[password]@"を削除して下さいね。

アップデート後にPackage Control使えなくなったんだけど!

ワンライナーの実行に何回か失敗していると、ignored_packagesへPackage Controlが失敗回数分だけ追加された状態になってしまいます。
Preferences(Settings - Default もしくは User)を開き、ignored_packagesのセクションを確認して下さい。"Package Control"があったら全部削除。プロキシ絡みの処理に失敗すると、その先のig.remove(n);が実行されずに残ってしまうんですね。困ったね。

過去の記事に加筆

Package Control 2.0時代の記事にも加筆しておきました。