感谢所有帮助。我们实施的最终解决方案从每个答案中提取了一些内容。
我们发现使用简单的批处理文件可以更轻松地处理多个环境。我并不是说这是最好的方法,但是对于我们给定的场景和要求,这很有效。用您的项目名称补充“项目”,用您的环境名称(开发、测试、阶段、生产等)补充“环境”。
这是我们“ccnet.config”文件的任务区。
<!-- override settings -->
<exec>
<executable>F:\Source\Project\Environment\CruiseControl\CopySettings.bat</executable>
</exec>
<!-- compile -->
<msbuild>
<executable>C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe</executable>
<workingDirectory>F:\Source\Project\Environment\</workingDirectory>
<projectFile>Project.sln</projectFile>
<buildArgs>/noconsolelogger /p:Configuration=Debug /v:diag</buildArgs>
<targets>Rebuild</targets>
<timeout>0</timeout>
<logger>ThoughtWorks.CruiseControl.MsBuild.XmlLogger,ThoughtWorks.CruiseControl.MsBuild.dll</logger>
</msbuild>
<!-- clickonce publish -->
<exec>
<executable>F:\Source\Project\Environment\CruiseControl\Publish.bat</executable>
</exec>
您会注意到的第一件事是 CopySettings.bat 运行。这会复制环境的特定设置,例如数据库连接。
接下来,标准的 MSBUILD 任务运行。任何编译错误都会在这里捕获并正常处理。
最后要执行的是 Publish.bat。这实际上从命令行再次执行 MSBUILD “重建”,并且来自 CruiseControl 的参数会自动传入和构建。接下来,为“发布”目标调用 MSBUILD。发布重建时为发布提供完全相同的参数。这使内部版本号保持同步。此外,我们的可执行文件命名不同(即 - ProjectDev 和 ProjectTest)。我们最终会得到不同的版本号和名称,这允许 ClickOnce 完成它的工作。
Publish.bat 的最后一部分将实际文件复制到它们的新位置。我们不使用 publish.htm,因为我们所有的用户都在网络上,我们只是给他们桌面上清单文件的快捷方式,他们可以单击并始终运行正确的可执行文件,其版本号与巡航控制。
这里是 CopySettings.bat
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\app.config" "F:\Source\Project\Environment\Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.Designer.vb" "F:\Source\Project\Environment\Project\My Project" /Y /I /R
XCOPY "F:\Source\Project\Environment\CruiseControl\Project\My Project\Settings.settings" "F:\Source\Project\Environment\Project\My Project" /Y /I /R
最后,这里是 Publish.bat
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:rebuild "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationRevision=%CCNetLabel% /property:AssemblyName="ProjectEnvironment" /property:PublishUrl="\\Server\bin\Project\Environment\\"
C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /target:publish "F:\Source\Project\Environment\Project\Project.vbproj" /property:ApplicationVersion="1.0.0.%CCNetLabel%" /property:AssemblyVersion="1.0.0.%CCNetLabel%" /property:AssemblyName="ProjectEnvironment"
XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish" "F:\Binary\Project\Environment" /Y /I
XCOPY "F:\Source\Project\Environment\Project\bin\Debug\app.publish\Application Files" "F:\Binary\Project\Environment\Application Files" /Y /I /S
就像我说的那样,它可能没有按照 CruiseControl 和 MSBUILD 开发人员的预期工作方式完成,但它确实有效。如果您需要在昨天完成这项工作,它可能就是您正在寻找的解决方案。祝你好运!