XX-net / XX-Net

A proxy tool to bypass GFW.
32.98k stars 7.7k forks source link

建议用git进行用户端的更新 #1818

Open linhua55 opened 8 years ago

linhua55 commented 8 years ago

1.本工程是用源码的形式发行的,而不是用二进制包,所以不用每次更新都下载一个压缩包

2.(不重要)可以进行快速反馈,提高迭代速度。例如在 https://github.com/XX-net/XX-Net/issues/1660#issuecomment-166215032https://github.com/XX-net/XX-Net/issues/1662#issuecomment-166216079 中,如果开发者没有测试环境,则需要用户测试,这时开发者需要推送一个beta版本给用户,用户更新后提交反馈结果,让用户手动更改,出错高,不便于进行反复修改。(例子中beta版本是由开发者在comment中给出,并由用户手动输入更新的,如果用git,则可由开发者建立一个beta版本的branch,然后用户端可以用简单的cherry-pick更新或直接同步到这个branch)

3.如果将来分模块,可以将不同模块分为不同的工程维护。

4.git clone时下载的内容大约为10M,如果不保留以前的历史(git clone git://xxoo --depth 1),大约7M。与zip压缩包差不多大小,但都不支持断点续传,可以使用代理(https://m.oschina.net/blog/347491)

5.windows端可以写bat脚本,linux和mac os x 下使用shell脚本维护更新(也有程序( https://github.com/BYVoid/Batsh )可以实现统一的脚本然后转换成bat脚本和shell脚本) -- 需要先检查用户是否作出改变,如果作出改变,需要先提交用户的改变,再git pull --rebase更新 -- 关于回溯以前的版本(并保留用户作出的改变)?

xxnet commented 8 years ago

​有考虑过,可是git包28M(Portable 版本)

不过可以考虑用这个: https://github.com/jelmer/dulwich

python 实现的git,压缩包才800k

分模块的事情想很久了,应该不会太难,重点是一个VBScript版本的安装脚本,把最初始的python环境下载下来,后面的用python去把剩余需要的模块逐个下载就容易了。 所有的难点就是VBScript去github下载zip文件然后解压、启动,处理好异常情况就好了。

剩下的工作就是拆分工程,这个就是花点时间问题。

模块拆分好了,升级库、增加辅助模块就方便很多. 每个下载文件也变小,不容易失败。

linhua55 commented 8 years ago

感觉不应该想的那么复杂,应该假设用户已经安装了git工具,毕竟它是不会被认证的。 用户可以使用任何习惯用的下载工具去任何地方(如 http://rj.baidu.com/soft/detail/30195.html?ald )下载安装git 其实初始化下载的时候,git就相当于一个下载器,只是后续的自动更新,用git较简便。 另外python环境,也可以让用户单独安装,没必要想得那么复杂,增加自己的负担。

xxnet commented 8 years ago

​其实社区里反馈的已经属于高级用户了,大部分小白用户都没有github帐号,更加不懂什么git

想象读书的学生,只是为了申请个签证,下载个翻墙软件,连设置代理是什么意思都不明白

linhua55 commented 8 years ago

意思是使用python或bat脚本调用git命令行工具(给出提示,用户来选择),当然不可能让他们敲命令了。

xxnet commented 8 years ago

​需要小白用户安装git吗?

linhua55 commented 8 years ago

@xxnet 这个是需要的,不过感觉git的windows安装器和QQ的安装器难度一样。 如 http://www.cnblogs.com/monodin/p/3268679.html

只是见最近因为更新出问题的很多,才提出来

yeahwu commented 8 years ago

这个硬生生没看懂,好像得要git客户端吧?得要帐号吧?这样看来还没有sync方便,至少人家不需要帐号。

linhua55 commented 8 years ago

@yeahwu 不需要帐号,只是在本地使用

ghost commented 8 years ago

@linhua55 需要下载东西,差评。

linhua55 commented 8 years ago

如果用git更新的话,那么发行的zip压缩包里应该含有.git文件夹(即应是个git仓库),如果这样的话,初始化下载解压是不需要使用外部的git工具的

jzp820927 commented 8 years ago

我也支持用 git 更新,虽然需要下载和安装 git 客户端软件,但是从长远考虑,好处很明显,git 只是在第一次下载 XXNET 的时候,需要下载安装一次,以后就不需要了,但是更新就方便多了,一是通过 git 的方式更新是增量更新,每次更新只下载修改代码的那一部分几KB的文件,比每次更新都要下载整个安装包7MB好多了,而且下载量小,也可以很轻松的解决GFW干扰导致下载断流,使得运行的时候出现的诸多怪异的报错问题。从长远看,好处比坏处多很多。 或者按作者说的,在xxnet里集成 https://github.com/jelmer/dulwich,python 实现的 800k 的 git。

另外我也提出另一种更新解决方案,BitTorrent Sync,现在很多软件和代码都用这个同步发布更新,这个比 git 更方便,不用用户任何操作,自动实时同步更新,而且是P2P方式,用户越多,更新速度越快。最重要的是,不受任何干扰。其他的,不多说,你懂得。。。

最后我建议,多种下载方式可以并存,小白用户可以用小白方式更新,大神可以用大神的方式更新,最后在Wiki页专门开一个关于下载的说明,介绍几种下载方式,由用户自己现在用哪种方式更新。

xxnet commented 8 years ago

如果重长远看,git的方式肯定好,不过如果为了下载7M的软件,要先去下载 21M的工具,这个得不偿失,甚至要用户分两步去下载,就太不合理。

比起每次升级下载7M文件,降低新用户的门槛更加重要。

git的优势是可以增量更新,如果python实现的git足够稳定,可以考虑写一个分步下载的工具,windows下先下载一个python环境, 然后用git去下载剩余的模块,甚至这个过程可以做到p2p。

不过让我们来看看,最终解决哪些问题?

哪里漏了的,请补充

感觉git分发、升级,对于非常大的项目比较有用,比如基于p2p的网站内容

yeahwu commented 8 years ago

完全不顾即万年2.0.5版的感受,不就是升级嘛,你这搞得比嫖娼还麻烦。

jzp820927 commented 8 years ago

好吧,确实这不是目前的主要问题,可以不急,目前主要保证稳定运行就行了。一般不出问题,估计也很少有人更新,我就还是用的 2.7.3,一直没更新!

lele2010lele commented 8 years ago

2.05很好啊

ghost commented 8 years ago

为何不更新?直接把老版本xxnet的IP文件弄出来之后,装新的xxnet然后把IP文件放进去不就好了吗?

ghost commented 8 years ago

如果你们是因为下载总是中断的问题。那你们可以去百度贴吧,lantern吧,那个置顶帖里有xxnet的最新版本。就是那个“关于有的时候lantern不能用,大家可以进来看看。”这个置顶帖里。3楼里。我放的2.8.9版本的。

linhua55 commented 8 years ago

如果要平滑过渡到git更新的话,那么python实现的git是较好的选择,不过发行时,需要手动上传含有git仓库(目录下有 .git文件夹)的zip包,不能由tags建立了。

xxnet commented 8 years ago

刚才看了下,​zip包是不包含git信息的。

如果能够用python版的git工具,那么可以考虑这样:

下载过程改成多个步骤:提供一套安装脚本,先去下载最基本的python环境(windows平台需要,Linux/Mac不需要),然后下载python版的git库和相应的安装脚本, 接下来,直接从github clone各个模块,而且要指定某个release的稳定版tag。

用git还有一个好处:以后可以方便的在各个版本之间切换,发现某个版本不稳定,用git进行切换,而且切换的成本很低。

linhua55 commented 8 years ago

如果使用P2P,IPFS 是一个选项

xxnet commented 8 years ago

​ipfs ,很强大

linhua55 commented 8 years ago

不知道自己更新自己(自举)会不会出问题,要特别小心处理python.exe及与写文件(覆盖文件)相关的dll。 可参考 如何让程序自己更新自己的方法

搜索 python的自动更新框架 竟然找到这个 code.google.com/p/gfanqiang/ 特色之一就是自动更新 出自 求一个用python编写的自动更新框架 它是用另一个php环境+php代码来实现自动更新 @wwqgtxx

也许单独一个git.exe更好

linhua55 commented 8 years ago

使用libgit2库较好,实现较完整 在msys2上编译生成的32位libgit2的静态链接库大小为912K,动态链接库(经strip)大小为1000K

方案1:使用go语言生成单个exe文件。使用libgit2的go封装库git2go ,编译、链接时需要使用libgit2的静态链接库。关于生成的exe文件的自我更新,可用go的自动更新框架,如go-selfupdate ,也可以用python更新(你更新我,我更新你)。当然需要将这个exe文件加入.gitignore文件里

方案2:使用python语言。使用libgit2的python封装库pygit2。默认是使用libgit2的动态链接库,也许可以修改setup.py,从而使用它的静态链接库(从而不用保留它的库文件),可参考 http://stackoverflow.com/questions/4597228/how-to-statically-link-a-library-when-compiling-a-python-module-extension ,不过大小应该变化不大。 pygit2依赖cffi,pycparser。如果是使用libgit2的动态链接库安装的pygit2(这是默认的方法),这三者的wheel文件大小分别为:

大小 文件名
136k cffi.whl
128k pygit2.whl
184k pycparser.whl

另外 340k 经zip压缩的libgit2的动态链接库文件

用virtualenv进行测试的,详情见 http://www.pygit2.org/install.html#libgit2-within-a-virtual-environment

XX-Net-2.8.9.zip 压缩包大小为8.1M,解压后用7-Zip压缩得到的7z压缩包大小为5.0M git clone 仓库,git输出的信息中显示传输的数据量是10.72M,传输完后,用7z压缩得到的7z压缩包大小为16M,看来git特殊处理了它的冗余信息。 使用git bundle命令,可参考 https://git-scm.com/blog/2010/03/10/bundles.html

 git bundle create ./repo.bundle master

得到的repo.bundle文件也是10.72M,再用7z压缩此bundle文件,得到的压缩包文件大小为10.40M,几乎没差别。

xxnet commented 8 years ago

​发现最近升级失败导致无法使用的问题很严重。

目前这个升级机制存在问题,一旦有文件覆盖失败,那么重启就可能就失败了。 理论上应该那么成功升级,要么不升级,不能升级失败,也无法使用了。

simonasd commented 8 years ago

@xxnet

所以目录可以是这样的: ----data文件夹 --------gae_proxy文件夹 ------------certs文件夹 ------------ca.crt ------------IP和log等 --------launcher文件夹 ------------config.yaml等 ----2.8.8文件夹 --------gae_proxy文件夹 --------launcher文件夹 --------php_proxy文件夹 --------python27文件夹 ----2.8.9文件夹 --------gae_proxy文件夹 --------launcher文件夹 --------php_proxy文件夹 --------python27文件夹 ----start.vbs ----start.bat

还可以把python27文件夹独立出来。这样就更减小了每次更新的体积。

xxnet commented 8 years ago

非常同意!

1.x.x版本时,目录结构是这样: data gae_proxy launcher goagent/3.2.20/

         /3.2.21

launcher/1.0.0

         /1.0.1

启动哪个版本,依赖 data/launcher/config.yaml 里的配置,没有配置就自动选一个最新的版本。

这个结构后来觉得路径太深了,不方便,就取消版本号。 看来可以考虑把这个加回来,做如下改变:

  1. 模块拆分,每个模块分不同项目 库拆分到不同地方,独立下载,这样下载更稳定
  2. 模块版本建立依赖关系,避免版本之间不兼容
  3. 建立分模块下载的脚本,用户执行下载脚本之后,下载脚本根据本机环境下载需要的模块
  4. 另外提供一个打包好的全量包,以解决下载模块无法工作的情况(比如离线安装或拷贝到多太机器)

p2p方式,先要有p2p,然后要签名,这些门槛比较高,目前没有好的思路。 apt-get / yum/ pip 等没有弄过,谁弄过的过来帮忙搞一个

在 2016年1月10日 下午8:44,simonasd notifications@github.com写道:

@xxnet https://github.com/xxnet

- 覆盖失败的问题:参考Chrome的更新方式,程序根目录放置主程序(在本项目则是启动脚本)。更新并不是替换文件,而是新旧版本文件夹共存(仅保留一个旧版本,可用于出错回滚),然后修改启动脚本中的路径即可。此外,Chrome还有一点值得学习,其程序与用户data是分开存放的,更新时不影响data文件夹。

所以目录可以是这样的: ----data文件夹 --------gae_proxy文件夹 ------------certs文件夹 ------------ca.crt ------------IP和log等 --------launcher文件夹 ------------config.yaml等 ----2.8.8文件夹 --------gae_proxy文件夹 --------launcher文件夹 --------php_proxy文件夹 --------python27文件夹 ----2.8.9文件夹 --------gae_proxy文件夹 --------launcher文件夹 --------php_proxy文件夹 --------python27文件夹 ----start.vbs ----start.bat

还可以把python27文件夹独立出来。这样就更减小了每次更新的体积。

  • 关于分发方式 可以提供多种下载方式,直接下载zip,P2P,git,yum,apt-get,pip,等等。方式越多越好。一方面避免Github失效,一方面可以扩大影响力。当然,这些不同的分发方式,打包的内容肯定不相同。zip包要全,而采用yum命令安装的包就不需要带py环境和windows兼容的东西了。此外还要引入验证机制,防范文件篡改。

— Reply to this email directly or view it on GitHub https://github.com/XX-net/XX-Net/issues/1818#issuecomment-170341968.

jzp820927 commented 8 years ago

@simonasd 支持你的想法,这个目录结构很不错,按功能分成不同的目录,而且把数据文件夹独立出来方便更新,并且保留上一个旧版本用于升级失败时候的回滚。非常不错,支持!

xxnet commented 8 years ago

规划下一个大版本 3.x 把结构换掉吧,直接拆分模块到不同的项目。 新用户只需要下载一个安装脚本,然后逐个模块下载。

ghost commented 8 years ago

@xxnet 右键切换模式那里。其实没有问题。主要是他切换的是局域网代理。而局域网代理是给路由器用的。用拨号连接的人是用的设置。而不是局域网代理的设置。你能不能先把这个问题解决了啊

xxnet commented 8 years ago

@panzer 拨号连接方式,有没有哪个软件解决了的?我们可以参考。 最后还是调用api,什么语言无所谓,python 有ctypes可以直接调用win32的api

jzp820927 commented 8 years ago

@xxnet 支持下一个大版本 3.x 模块化,不光是分模块下载,还可以考虑根据不同的系统平台下载不同的模块。比如在 Linux 和 MAC 下,系统自带 python 环境,就不用下载 python 的库和相关文件了,这样,Linux 和 MAC 更新,基本上就下载几百KB的文件,非常方便了!

xxnet commented 8 years ago

​是的,包括要支持OpenWrt/Android等平台,模块化可以为平台定制提供方便。 还有考虑把python 升级到3.5,3.5 提供协程,能够提高不少性能,而很多操作系统都是没有支持到这个版本, 需要下载这个python环境才行。

jzp820927 commented 8 years ago

如果能够提高性能,那是必须要支持的啊,现在XX的稳定性已经很不错了,下一步能做的,就是提高性能了。

xxnet commented 8 years ago

​其实PC上的性能还过得去,但如果路由器和手机上,性能会比较敏感。 这里说的性能是指CPU消耗,网络性能要靠算法优化。

jzp820927 commented 8 years ago

哦,那是我理解错了,我以为你说的 网络性能,运行性能,主要就是路由和移动端了,PC上毫无压力!

xxnet commented 8 years ago

网络性能差异以百毫秒记,需要算法优化,python完全足够了。​ 手机上和路由器上,CPU性能低很多,PC上CPU 1%,到了手机就是10%,而且手机要考虑耗电。

ghost commented 8 years ago

@xxnet 反正SS和ssr似乎解决了。但是具体他怎么解决的我并不清楚。

xxnet commented 8 years ago

​好,去看它代码就ok了

ghost commented 8 years ago

@xxnet 所以现在解决了吗

Kisesy commented 8 years ago

@panzer1313208 我不是早就提交代码了嘛,你下最新版试试

yeahwu commented 8 years ago

@kisesy 没想到这里能看到你!😄 Kisesy notifications@github.com于2016年1月13日 周三19:51写道:

@panzer1313208 https://github.com/panzer1313208 我不是早就提交代码了嘛,你下最新版试试

— Reply to this email directly or view it on GitHub https://github.com/XX-net/XX-Net/issues/1818#issuecomment-171264593.

ghost commented 8 years ago

@xxnet @Lrevor 你们怎么解决的呀?真的可以用了呢。

Kisesy commented 8 years ago

@yeahwu i_f25见到我很兴奋?

ghost commented 8 years ago

@Lrevor 你是谁呀?还有你的表情是怎么弄的呀?

yeahwu commented 8 years ago

你是不是那个搞lantern的kisesy呀?去pac去弹窗的小工具。毕竟是老坛子里的老朋友了嘛!

xxnet commented 8 years ago

已经有人提交pull了,你下载2.8.10试试看

xxnet commented 8 years ago

​老朋友都在,高兴啊

Kisesy commented 8 years ago

@panzer1313208 关于拨号连接解决方法:关键就在这条注册表里 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings\Connections 这里有好多个键,都是些连接名称,例如拨号时的名称就在这里面 以前xx-net设置时,只是设置了 DefaultConnectionSettings 的值,这个呢就是IE设置里的局域网设置 现在的解决方法是把里面所有的连接都进行设置,就这样。。。 其实可以优化一下,只修改当前连接

linhua55 commented 8 years ago

Clear Linux* OS for Intel® Architecture is the first Linux distribution that supports auto proxy. https://clearlinux.org/features/autoproxy

ghost commented 8 years ago

这个问题解决了我就放心了。刚刚测试了一下的确可以切换了。【心里一块大石头终于落地了。呼。】