如何使用cc.net / cruiscontrol删除目录?
Possible Duplicate: Pre-build task - deleting the working copy in CruiseControl.NET
我想在cruisecontrol构建过程中删除我的工作目录...我敢肯定这很容易,但是我一直找不到它的示例...
如果我们知道如何创建目录,那也会很有用。
谢谢。
解决方案
回答
两种方式之一。
- 如果我们已经在使用MSBuild文件或者类似的文件,则将操作添加到MSBuild文件中。
- 与其直接执行某些命令,不如创建一个执行该命令的批处理文件,然后删除目录,然后让CCnet调用该批处理文件。
回答
我的猜测是,我们想在CruiseControl.NET从源代码管理获取最新代码之前删除工作目录。如果是这种情况,那么完成此任务的唯一方法是为CruiseControl.NET编写一个自定义源代码控制提供程序,该程序首先删除工作目录,然后获取最新代码。查看CruiseControl.NET的源代码,以获取有关如何编写源代码控制提供程序的示例。
如果要在从源代码管理检索到最新代码后删除工作目录,则可以通过运行" cmd / c del directoryname"来使用CruiseControl.NET的可执行任务。
回答
对我来说,在ASP.NET工作中,最简单的方法(这使我可以根据项目打MSBUild或者NAnt)是滚动我自己的exe,该exe带有一个参数,该参数通过发射的bat文件传入由CC.NET。这不是世界上最安全的事情,但是如果我们完全控制自动化的构建机器,那么这是最安全的选择。不太破旧。快速且可重复使用。
将exe放在执行递归删除的位置:
`
静态void Main(string [] args)
{ for (int n = 0; n < args.Length; n++) { if (Directory.Exists(args[n].ToString())) { Directory.Delete(args[n].ToString(), true); } } }
`
将其放到多个文件可以传递参数的地方,并为每个项目编写一个自定义的.bat文件。所以我的任务块看起来像这样:
<tasks> <msbuild> <executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable> <workingDirectory>Z:\WorkingDirectory</workingDirectory> <projectFile>YourSolution.sln</projectFile> <logger>C:\Program Files\CruiseControl.NET\server\ThoughtWorks.CruiseControl.MsBuild.dll</logger> </msbuild> <exec> <executable>Z:\SomePathToBuildScripts\YourCustomBat.bat</executable> </exec> </tasks>
然后最后一步是设置该.bat文件,以在使用后执行删除/重建功能。如果我们希望将站点发布回该目录,请确保在bat文件中重建(" MD")已删除的目录。在开发人员的盒子上,我发现这是防止心爱的Frankenbuild的最佳方法。
回答
我过去这样做的方法是本身没有CC.Net结帐源。相反,该项目有两个<msbuild>
元素,第一个调用运行svn-clean.pl(编译为.exe)的构建目标,然后使用svn.exe更新源。第二个<msbuild>元素开始主构建过程。
我们可以轻松地用delete命令替换svn-clean。对于我的项目,从签出中删除谷壳总是比签出新的工作副本要快。
这两个msbuild元素是必需的,因为主项目的生成文件经常被更新。这很重要,因为只有在启动新的msbuild进程后,才会重新加载对构建文件的更新。
当我(很少)移动或者更改该"清理更新"构建目标的依赖关系时,这种设置会崩溃,以至于msbuild进程需要重新加载才能运行运行"清理更新"目标的有效指令。发生这种情况时,我将在提交前停止CC.Net,进入CC.Net服务器,然后手动进行" svn更新"。
提示:到目前为止,CC.Net很可能具有自然的"生成前清理"操作。此后,我搬到了TeamCity,可以将其配置为在每次构建时或者仅在开发人员选择时执行此操作(例如,当我们知道所做的更改不会干净地更新时-带有构建产品的目录的svn移动头脑)。