Package Control 又掛了,附解決方案

今天 Sublime Text 安裝 插件是,提示錯誤:

Package Control
There are no packages available for installation
Please see https://packagecontrol.io/docs/troubleshooting for help


——
2019-6-28更新:文章已經編輯,更換為香港地址
——-
最近收到反饋,無法使用,現在最新的 channel_v3.json為 3.32 MB,可能我的系統環境問題,通過PHP輸出不全,現在改成了靜態緩存,地址: http://hk.miaoqiyuan.cn/products/proxy/channel_v3.json 。?不能自動觸發一周一次的緩存更新,如果需要最新版請訪問下: http://hk.miaoqiyuan.cn/products/proxy.php/https://packagecontrol.io/channel_v3.json,系統就會更新為最新的緩存。
——

控制臺提示:

Package Control: Attempting to use Urllib downloader due to WinINet error: Error downloading channel. Connection refused (errno 12029) during HTTP write phase of downloading https://packagecontrol.io/channel_v3.json.
Package Control: Error downloading channel. URL error [WinError 10060] 由于連接方在一段時間后沒有正確答復或連接的主機沒有反應,連接嘗試失敗。 downloading https://packagecontrol.io/channel_v3.json.

也考慮過最簡單的方法,將channel_v3.json 保存到自己的服務器上,修改 Sublime Text 的配置文件。這種缺點也很明顯,會和官方插件不同步(雖然新出的插件頁用不到),編寫了一個小代理腳本,會兩個小時自動同步一次,完美的解決了這個問題。當然,官網服務器加入出現故障時,本腳本不會更新,仍使用本地緩存。

Package Control 不能使用?

使用方法如下(以我我已經部署好的地址為例,如果不放心我,可以在頁面底部下載源碼自行部署):
1. 打開 Settings User

打開 Sublime Text,選擇 references -> Package Setting -> Package Control -> Settings User

2. 輸入配置信息 打開配置文件后,輸入 channels 信息(請參考頁面頂部路徑說明 ,以線上地址為例):

"channels": [
	"http://hk.miaoqiyuan.cn/products/proxy/channel_v3.json"
],

這里輸入代碼

3. 保存后,Package Control 已經可以正常使用了

Package Control 不能安裝?

Package Control 可以安裝插件了,在備用機例發現 Package Control 現在竟然無法安裝成功,這個有點繁瑣,還在用同一個腳本也解決了。

安裝時的錯誤提示如下:

Error installing Package Control: HTTPS error encountered, falling back to HTTP –
Error installing Package Control: HTTP error encountered, giving up –
error: An error occurred installing Package Control

Please check the Console for details

Visit https://packagecontrol.io/installation for manual instructions

那我們就 順著 https://packagecontrol.io/installation 向下來。先給本頁面代理,并替換安裝地址,最終代理后的地址如下: http://hk.miaoqiyuan.cn/products/proxy.php/https://packagecontrol.io/installation。

1. 直接訪問上面提到的安裝地址,獲取安裝代碼

程序會自動替換安裝腳本的網絡路徑,已我已經部署好的地址為例,安裝代碼為:

import urllib.request,os,hashlib; h = '6f4c264a24d933ce70df5dedcf1dcaee' + 'ebe013ee18cced0ef93d5f746d80ef60'; pf = 'Package Control.sublime-package'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( 'http://hk.miaoqiyuan.cn/products/proxy.php/http://packagecontrol.io/' + pf.replace(' ', '%20')).read(); dh = hashlib.sha256(by).hexdigest(); print('Error validating download (got %s instead of %s), please try manual install' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), 'wb' ).write(by)

2. 打開Sublime Text 控制臺,復制代碼安裝

打開 Sublime Text,在 View 菜單下,找到 Show Console。在底部控制臺復制上面的代碼后,按回車,很快就會安裝完畢(和官方安裝方法一致)。

安裝完畢后,別忘了參考上面的教程更改 channels

問題解決,吹吹牛

這樣處理后已經能用了,趁現在心情好,順便吹吹牛,煽煽情:

最為一個中國的開發者,吃飯的家伙經常 因為 墻 的問題 沒法使用。

雖然 阿里、網易 的鏡像能解決大部分問題,但是對于小眾的軟件就只沒辦法了(比如 神器 Sublime Text),每次出問題都把自己折騰的焦頭爛額,影響工作進度。比如 Sublime Text,之前從同行的博客分享中找到了 channel_v3.json,他的站點因為備案問題,今天也不能訪問了。。。

我的目標是這樣項目把所有 小工具因墻出現的問題 都解決了,讓中國程序員不怕斷網、不怕被墻,開開心心快快樂樂的編碼。(不管能不能實現,這個牛先吹著)

代理腳本也很簡單,只有60行代碼:

<?php

	define('CACHE', './proxy/cache/');
	define('CONFIG', './proxy/conf/');

	$url = isset($_SERVER['PATH_INFO']) ? $_SERVER['PATH_INFO'] : '';
	$url = substr($url, 1);
	$url = preg_replace('/(https|http):\//', '$1://', $url);

	//驗證請求是否合法
	$white = json_decode(file_get_contents(CONFIG . 'white.json'), true);
	$matched = false;
	$verify = false;
	foreach ($white as $item) {
		if (preg_match($item['pattern'], $url)) {
			$matched = true;
			$verify = $item['verify'];
			break;
		}
	}
	if (!matched) {
		header('404 Not Found');
		die("

<h2>Only whitelisted links are allowed</h2>


");
	}

	//根據請求獲取MIME
	$mimes = json_decode(file_get_contents(CONFIG . 'mime-lite.json'), true);
	$ext = explode(".", $url);
	$ext = $ext[count($ext) - 1];
	$ext = '.' . $ext;
	if (empty($mimes[$ext])) {
		$ext = '.html';
	}
	$mime = $mimes[$ext];

	//緩存文件,兩小時更新一次
	$cache_file = CACHE . md5($cache) . $ext;
	if (!is_file($cache_file)) {
		$will_refrech = true;
	} elseif (time() - filemtime($cache_file) > 7200) {
		$will_refrech = true;
	} else {
		$will_refrech = false;
	}

	if ($will_refrech) {
		$body = file_get_contents($url);
		if (empty($verify) || preg_match($verify, $body)) {
			file_put_contents($cache_file, $body);
		}
	}

	//輸出結果
	if (is_file($cache_file)) {
		header("Content-Type: ${mime}");
		header("Last-Modified:" . gmdate("D, d M Y H:i:s", filemtime($cache_file)) . " GMT");
		header("Content-Length:" . filesize($cache_file));
		echo file_get_contents($cache_file);
	} else {
		header('404 Not Found');
		die("

<h2>Server Error!</h2>


");
	}

項目已經在 Gitee.com 開源,可以直接去 https://gitee.com/mqycn/Proxy-for-Chinese-programmer/ 下載。

已經實現:

1、支持自動更新 雖然之前可以使用,但是因為 是手工保存到服務器靜態文件,只能使用老的插件?,F在設置的每兩小時更新一次

2、在官網出現故障時仍能訪問 在自動和官網同步時,會 判斷 官網是否返回正確的代碼

3、一套最好能支持多個代理 借用 PHP 的PATH_INFO,可以非常方面的傳入任何 URL,可以對全網實現代理。當然,本程序也提供了白名單。

當然代理是有前提的:

1、對于被墻的代理,必須將域名放到 境外服務器

2、對于Sublime Text,服務器必須支持 IPv6

白名單設置說明
配置文件在: proxy/conf/white.json

[
  {
    "pattern": "/https\\:\\/\\/packagecontrol\\.io\\/channel_v3\\.json/",
    "verify": "/\"repositories\"/"
  },
  {
    "pattern": "網址正則正則表達式,只有在列表中匹配到的url才可以訪問",
    "verify": "內容正則正則表達式,只有返回的內容能匹配本規則,才會寫入緩存。也可以為false,不判斷直接寫入緩存"
  },
]

6 thoughts on “Package Control 又掛了,附解決方案

  1. senlinwang

    多謝博主,昨晚還可以的,今晚回家就不行了,還以為是我家網絡問題。

發表評論

電子郵件地址不會被公開。 必填項已用*標注

此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據。