Visual Studio .NET 2003をコマンドプロンプトから操作してビルドできるの知らなかった。さっき知った。
コマンドプロンプトから.NETのコードをビルドするには、.NET Framework 1.1まではcscとかvbcとかにオプションを渡すしかないと思ってた。これだと、プロジェクトやソリューションファイルを扱えなくて、ソースのファイルをいちいち指定しなきゃいけない。だから参照設定やらを自分で全部かかなきゃいけなくて、結構メンドイ。後で修正するのも大変。.NET Framework 2.0以降だとmsbuildがあるので問題ないけど、1.1ではホントに厳しいと思ってた。
そしたらなんと、Visual Studioの実体が置いてあるところにdevenv.comってのがあって、コレ使うとコマンドラインからもソリューションファイルを読ませてビルドとかができるようになる。
詳しくはMSDN で。簡単に言うと、
devenv /build release hoge.sln
こんな感じ。もちろん、/rebuildでリビルドになるし、debugを渡せばデバッグビルドも可能。ビルド結果も標準出力や標準エラー出力に出てくる。
これはいいですね。svnから最新リビジョンを取ってきて自動ビルドとかもできちゃう。
ちなみにさっきも書いたように、.NET Framework 2.0以降にはmsbuildというのがあって、xmlの定義を元にビルドできる。しかも、Visual Studio 2005以降のプロジェクトファイルは、まさにmsbuildが読めるxmlそのものなので、そのままビルド可能。ソリューションファイルはそのまま読めるxmlではないけど、自動的に変換してくれる。マジで便利。
「それNAntで」とか言っても「ハァ?」と言われてしまうような境遇でも、devenvをコマンドプロンプトで呼び出すくらいなら伝わるんじゃないかな。
翻译:
原来并不知道可以在命令行中对Visual Studio .NET 2003的工程文件进行编译,现在知道了。
原来以为在.NET Framework 1.1环境下用命令行编译.NET的源码只能是用csc或者是vbc加上一些参数,但是这不能编译整个解决方案文件或工程文件,只能一个文件一个文件编译,这样一来编译起来将非常麻烦,而且不容易修改和维护。如果是.NET Framework 2.0以上的版本,因为有msbuild所以问题不大,但是在1.1版这是很棘手的问题。
后来发现在Visual Studio的安装目录(C:/Program Files/Microsoft Visual Studio .NET 2003/Common7/IDE)下有一个叫devenv.com的东西,用这个东西就可以实现整个解决方案和整个工程的编译【注:如果直接双击devenv.com会打开VS的IDE,这里的意思是在命令行运行该文件不会打开窗口,可以当一个命令来用】,详细介绍请参考MSDN。
简单的说可以使用如下命令:
devenv /build release mySolution.sln
【为方便起见可以把"C:/Program Files/Microsoft Visual Studio .NET 2003/Common7/IDE"加入系统变量%PATH%中】
devenv /build release mySolution.sln > Buildlog.log
当然,这里我们可以用 /rebuild 来重新编译,用debug来以debug模式编译,编译结果会直接显示在控制台中,当然如果想记录到Log文件中也可以。用管道就搞定了。
这样一来就非常方便了,从SVN(TortoiseSVN)得到最新代码,然后可以实现自动编译。
顺便说一下,刚才提到的.NET Framework 2.0以后有MSBuild支持,可以根据XML文件来进行编译(类似ANT)。而且Visual Studio 2005版以上的工程文件可以直接被MSBuild读取并编译,解决方案文件可以被自动转换以后编译,非常方便。
人家说:「用NAnt(NAnt is a free .NET build tool)也可以编译」 的时候,可以说「啊?用VS自带的devenv可以直接在命令行中编译!」
后记:其实编译大可以在VS的IDE中进行,鼠标点一下就行了,不过使用命令行进行编译的意义在于它可以进行批量编译,写一个批处理文件就可以一下子编译多个解决方案,或工程。比如一个Web项目,它可以由【服务端的解决方案】、【客户端应用程序】、【Web应用程序】等多个部分组成,每个部分都可以用一个Solution来实现,不过在编写和修改代码的时候,特别是多人合作写代码的时候,每次用CVS或SVN得到最新代码,就得Build一回,而且有的时候不能只Build自己的Solution,还要Build别人的Solution,那样还要多开一个IDE窗口,更糟糕的是,有些情况下两个Solution同时打开Build的话会发生冲突导致不能完成编译,这时如果写一个批处理文件来编译将省不少事。