比起大半年前这篇《Windows下一些开源工具的安装与配置》来说,我不管是在Linux环境还是Windows环境下的开源toolchain的使用都有了更多的经验。于是决定更新一下这篇文章。但是考虑到这次采用的方法与上次大有不同,于是重新开一片文章来细细讲述。

这次的安装方式比上次更为绿色。除了少量工具需要修正配置文件外,整个环境完全可以装在移动存储设备里随取随用。另外目录结构也更多的参考Linux下的设置,体验更统一一些。

环境的构建方式参考了很多资料,比如nuwen的MinGW环境打包cdsoft的绿色msys环境和portable python环境的构建方式,以及sunshine1988关于Node.js与NPM的自定义安装的文章。至于参考的各工具的官方文档就略过不提了。

环境内容目前包括:TDM-GCC,msys及其它实用工具,Git,Node.js&NPM,Python。


 

目录:

  1. msys和TDM-GCC的安装
  2. Git的安装
  3. Node.js&NPM的自定义绿色安装
  4. Python的绿色安装
  5. 其它可补充的工具配置

 

1.msys和TDM-GCC的安装

这次采用的方式与上次不同,没有使用官方提供的mingw-get工具进行安装。使用过的人大概也能发现,用这个工具安装后msys和mingw环境其实是分离开的,仅依靠PATH的设置统一在一起。另外因为需要安装TDM-GCC而非MinGW官方版的GCC,如何将两者很好的统一也是一个问题。

于是这次参考了nuwen的做法,直接下载msys的组件压缩包和TDM-GCC的包,然后解压到一起来构建一个统一的环境。具体步骤如下:

①获取msys的软件包列表和信息文件。

mingw-get工具是根据xml文件里的信息来安装mingw软件包的。获取这些xml文件对我们更好的寻找自己需要的软件包有很大帮助。在SF.net上这些文件存放在这里,但是很明显自己一个一个下载太累了。因为mingw-get本身也是绿色的,所以完全可以下载mingw-get的打包版,然后解压并用命令行进入到目录下执行mingw-get update来获取这些文件。这些文件会存放在mingw-get工具目录的/var/lib/mingw-get/data目录下。

②根据xml文件的信息挑选自己需要的msys软件包下载

所有的软件包都在MinGW的SF.net项目页面的Files里。

需要下载的基本的比如msysCORE,coreutils等。我还额外选择了wget,openssh之类的软件包。此处需要注意的是要照顾好各个软件包的依赖问题。在每个xml文件的接近末尾处,都会记录软件包的依赖(requires标签),需要连带这些包一起下载。稍后我会给出一个我下载的包的列表(其中包括TDM-GCC的一些包……其实是我分不清了=。=)。

另外一般来说只要下载后缀为bin的软件包即可。doc、lic等包括的内容对执行本身没有必要。ext里面会附加一些实用的额外脚本,也可以下载回来。lang是语言包,看个人需求,至少我是一个都没下载。

③下载TDM-GCC的组件包

TDM-GCC的Download页面提供了安装包下载,同时也提供了可自己挑选的组件包下载。除了OpenMP和几个Fortran、Ada等语言的支持包之外都下载回来。

值得注意的是TDM-GCC的安装包里提供了make,但是组件包的链接列表里没有提供,需要参照上一步的内容自己下载。mingw提供的make版本颇为复杂,还有msys和mingw版本的不同。我则是根据TDM-GCC的安装包里选择的,make-3.82-5-mingw32这个版本,似乎3.82是个stable版本。

④解压安装

所谓的安装其实只要解压就可以了。所有的包都是以.tar.lzma的格式存放,用7zip就可以解压。因为我构建自己的环境的同时也在使用nuwen打包的MinGW环境,所以可以直接使用它提供的命令行7z执行下面的命令就可以解压全部的软件包:

7za x *.lzma
del *.lzma /q
7za x *.tar
del *.tar /q

就这么简单。此时文件夹下就能形成/bin、/lib、/include、/libexec、/share等目录的形式,以及一个msys.bat的启动脚本。所有的软件包都不会发生文件冲突覆盖的情况,7z解压的时候会出现少量的覆盖提示,都是几个软件包的README文件而已。

这时可以运行msys.bat进入msys的bash环境,然后尝试gcc –version等命令看是否正常。另外随便在~目录下cat >> test之类的东西,让msys自动建立出home文件夹来。

⑤一些基本配置

和上次一样,msys需要经过一些基本的配置用起来才舒服。在/etc/profile下添加

1
alias ls="ls --color=tty --show-control-chars"

在~/.inputrc下添加

1
2
3
4
set meta-flag on
set input-meta on
set output-meta on
set convert-meta off

即可

软件包参考

下面是我挑选的msys+TDM-GCC的软件包列表。其中一部分是根据nuwen的msys环境挑选的。tar这个包其实可以不用(注意观察的话也能发现我选择的也没有完全满足它的依赖),因为我自己额外添加了7z的命令行工具在里面。

bash-3.1.17-4-msys-1.0.16-bin.tar.lzma
binutils-2.22-1-mingw32-bin.tar.lzma
bison-2.4.2-1-msys-1.0.13-bin.tar.lzma
coreutils-5.97-3-msys-1.0.13-bin.tar.lzma
diffutils-2.8.7.20071206cvs-3-msys-1.0.13-bin.tar.lzma
findutils-4.4.2-2-msys-1.0.13-bin.tar.lzma
flex-2.5.35-2-msys-1.0.13-bin.tar.lzma
gawk-3.1.7-2-msys-1.0.13-bin.tar.lzma
gcc-4.7.1-tdm-1-c++.tar.lzma
gcc-4.7.1-tdm-1-core.tar.lzma
gcc-4.7.1-tdm-1-dw2-libgcc.tar.lzma
gdb-7.5-1-mingw32-bin.tar.lzma
grep-2.5.4-2-msys-1.0.13-bin.tar.lzma
libexpat-2.0.1-1-mingw32-dll-1.tar.gz
libiconv-1.14-1-msys-1.0.17-dll-2.tar.lzma
libintl-0.18.1.1-1-msys-1.0.17-dll-8.tar.lzma
libintl-0.18.1.1-2-mingw32-dll-8.tar.lzma
libminires-1.02_1-2-msys-1.0.13-dll.tar.lzma
libopenssl-1.0.0-1-msys-1.0.13-dll-100.tar.lzma
libregex-1.20090805-2-msys-1.0.13-dll-1.tar.lzma
libtermcap-0.20050421_1-2-msys-1.0.13-dll-0.tar.lzma
m4-1.4.14-1-msys-1.0.13-bin.tar.lzma
make-3.82-5-mingw32-bin.tar.lzma
make-3.82-5-mingw32-lang.tar.lzma
mingwrt-3.20-2-mingw32-dev.tar.lzma
mingwrt-3.20-2-mingw32-dll.tar.lzma
msysCORE-1.0.18-1-msys-1.0.18-bin.tar.lzma
msysCORE-1.0.18-1-msys-1.0.18-ext.tar.lzma
openssh-5.4p1-1-msys-1.0.13-bin.tar.lzma
sed-4.2.1-2-msys-1.0.13-bin.tar.lzma
tar-1.23-1-msys-1.0.13-bin.tar.lzma
tar-1.23-1-msys-1.0.13-ext.tar.lzma
termcap-0.20050421_1-2-msys-1.0.13-bin.tar.lzma
texinfo-4.13a-2-msys-1.0.13-bin.tar.lzma
w32api-3.17-2-mingw32-dev.tar.lzma
wget-1.12-1-msys-1.0.13-bin.tar.lzma
zlib-1.2.7-1-msys-1.0.17-dll.tar.lzma

2.Git的安装

Git的安装和上次提供的方法大同小异。下载msysGit项目提供的PortableGit包,解压到一个目录里,然后在/etc/profile里添加PATH就可以了。以下以我自己的操作为例。

将PortableGit-1.8.0-preview20121022.7z里的内容解压到与/bin同级的/git目录里。然后在/etc/profile里添加

1
export PATH=$PATH:/git/cmd

这里用到了一个技巧,PortableGit实际是包含一个完整的msys环境的。上次我将git的bin目录加到了PATH里,虽然工作正常但是其实很多工具都有两份,用起来总是有隐患。而nuwen的MinGW包里则使用了将cmd目录加入PATH里的方法。cmd目录下只有一个git.exe的可执行文件,这样使PATH的内容干净了很多。另外**/git/cmd**的伪相对目录形式也有利于整个环境的移植。

相比较nuwen的MinGW打包直接使用cmd.exe作为执行环境,在msys里使用git的优势是ssh的配置文件会存放在msys的**/home/用户名/.ssh目录里,而非Windows的C:\Users\用户名.ssh**目录里,维护起来更方便,而且重做系统的时候配置文件也无需做迁移。

题外话:

我这次真是下了决心本打算只提取出git本身加入到我的msys环境里的,也没有打算独立出单独的目录(想直接放在bin里)。但是发现首先msysGit没有提供这样的二进制打包版本。其次msysGit的msys环境有很多工具(如antiword等)是开发组自己编译添加的,而不是MinGW项目提供的。这样使得我把自己的msys环境向msysGit靠拢变得非常麻烦……最后只得放弃,相比上次只做到了PATH看起来干净点这一条。


3.Node.js&NPM的自定义绿色安装

这两个货是最TM麻烦的……对不起我爆粗口了但是实在是把我折腾的半死。而且最后的解决方案也没那么干净。

首先既然要自定义绿色安装,自然不能采用Node.js提供的安装包。但是首先提醒的是,使用安装包安装后的Node.js确实是可以直接在msys环境里调用的,只是npm不能(需要添加一个POSIX-like的执行脚本)。

①下载安装Node.js&npm

单独的Node.js和NPM可以在http://nodejs.org/dist这个地址下载,最新版的Node.js在latest目录里,npm在npm目录里。注意下载npm时下载.zip后缀的。Node.js本身只有一个exe文件,干净的不能再干净。

在msys环境与bin目录同级建立local/nodejs目录,然后将node.exe放进去,然后将npm解压进去,使npm.cmd与node.exe在同一级目录。然后在/etc/profile里添加:

1
export PATH=$PATH:/usr/local/nodejs

可以注意到,其实msys环境里/usr指向的和/是同一个目录……但是usr实际是不存在的。

此时在msys环境里执行node -v已经可以成功,但是npm -v会提示找不到命令。因为bash是无法解析执行.cmd文件的。

要使npm正常执行,将node_modules/npm/bin目录下的npm(无后缀)拷贝到node.exe同级目录即可。打开看看可以发现这是一个*nix系统使用的shell脚本。此时再执行npm -v就没问题了。

②绿化配置

此时可以执行npm config listnpm config ls -l看到,有很多目录都是Windows的用户主目录而非msys的用户主目录。这是由于node.exe是Windows完全原生编译的,直接调用Windows的API,获取的也是系统真实的用户主目录。这一点对于整个环境的绿化当然是不利的,npm会将设置和缓存放置在**C:\User\用户名**目录下。

为了修正这一点,可以为npm添加全局配置,来覆盖npm现有的设置:

在node.exe所在的文件夹下新建etc文件夹和npm-cache文件夹。然后在etc文件夹下新建名为npmrc的文件,加入以下内容:

cache = msys根目录的绝对路径/local/nodejs/npm-cache
init-module = msys根目录的绝对路径/home/用户名/.npm-init.js
shell = bash.exe
userconfig = msys根目录的绝对路径/home/用户名/.npmrc
userignorefile = msys根目录的绝对路径/home/用户名/.npmignore

需要注意的是,msys根目录的绝对路径里盘符是可以省略的。如果是放在U盘上的环境,可以使用这种方法来省略盘符的配置。另外虽然我用了斜杠,但是反斜杠也是一样的……而且此处的目录也是Windows基准而非msys基准。

此时再运行npm config ls -l可以发现有很多default配置被global配置所覆盖,除了temp之外路径已经都变成msys环境下的目录了。虽然不是真正的绿化但是也还可以了。尝试执行npm install -g express看看npm-cache下是否出现了新的缓存文件,node.exe所在目录是不是出现了express的执行脚本。


 

4.Python的绿色安装

其实单纯从可执行的Python解析器来讲,只需要python.exe和几个dll文件。即使需要Python标准附带的库,将Python的官方安装包解压似乎也可以。但是此时pywin32就没法安装了。查找了很多资料进行了很多尝试之后,还是选择用Portable Python这个版本来做绿色安装。整个过程非常简单。

下载Portable Python 2.7的安装程序后,随便安装到什么目录,组件中只选择pywin32。然后将安装文件夹下App文件夹下所有内容拷贝到msys环境的/local/python目录里(即/usr/local/python)即可。然后向/etc/profile里添加下面的内容:

1
export PATH=$PATH:/usr/local/python/

就ok了。之前安装的Portable Python可以删除了。

题外话:

其实除此之外我还尝试了cdsoft的Portable Python打包。也研究了下他的打包脚本。他使用了一个叫做cx_freeze的Python工具,和py2exe类似也是用于将py脚本生成直接可执行的exe文件的。当然也会打包所选定的库文件。

他将Python安装好后,再安装cx_freeze。然后写了一个python.py的脚本,内容很简单,就是获取参数中的脚本和其它参数然后交与Python执行。说白了就是给Python套上了一层完全没意义的壳:python python.py myscript.py跟python myscript.py完全没区别。然后……他用cx_freeze把这个脚本打包成exe文件,并附带上所有的库……结果就成了一个绿色的看起来是Python自己的可执行程序=。=!之后简单的把cx_freeze生成的文件打包出来,然后把Python再卸载就ok了……

这个方法实在是tricky得不能更tricky……但是尽管它执行起来跟Python实际上没区别,我不知道如果我想要安装新的库它是不是还能正常工作。所以最终还是放弃了这个很有意思的Portable版本。


5.其它可补充的工具配置

首先,某些开发包之类的东西我可以也解压到/local目录里(比如winpcap和wxwidgets我就这么干的),然后调用起来就好像我在Linux底下自己./configure –prefix=/usr/local并编译安装的结果一样。当然也可以直接覆盖在msys环境的根目录里,直接include归include,lib归lib。nuwen就是这么干的。我犹豫了很久才没这么做……如果有空的话我会自己写一个安装脚本来记录这些文件的位置,以后升级也方便。

其次,我个人是没有在这个环境里放GUI界面的工具的。这个环境我放在了E:\DevEnv这样一个目录里,然后另外的GUI工具我放在了E:\Tools目录里。而且也是秉承一贯的习惯选择了绿色版,包括Dev-C++和Sublime-Text 2(这也是为什么我这次没装Vim)。同样的在/etc/profile里添加了Sublime-text可执行文件的alias。但是很奇怪的是……在msys里执行出来的Sublime-text 2字体要比直接执行的丑很多……至于原因我也没搞明白的说=。=


 

大致就是这个样子。Ruby的安装应该没什么变化,最近也没用到就不再折腾了。之前本打算自己写个轻量级的Node.js博客程序自己用,看到某人写的Node.js实现的Octopress类似物之后又挪不动腿了……稍微考虑一下假期可能会做个迁移吧。