Msbuild 如何通过CruiseControl.NET发布ClickOnce应用程序?

Msbuild 如何通过CruiseControl.NET发布ClickOnce应用程序?,msbuild,clickonce,cruisecontrol.net,publish,Msbuild,Clickonce,Cruisecontrol.net,Publish,我在开发服务器上安装了CruiseControl.NET 1.4版。每当开发人员签入代码时,都会进行编译 现在我们可以开始向测试人员提供我们的应用程序了。我们希望使用ClickOnce来分发应用程序,其想法是当测试人员去测试应用程序时,他们拥有最新的版本 我无法通过CruiseControl.NET找到实现这一点的方法。我们正在使用MSBUILD执行生成。您希望在MSBUILD中使用ClickOnce清单生成任务。这个过程有点冗长,所以我只想给大家指出几个链接。以下是希望让您开始学习的方法和步骤

我在开发服务器上安装了CruiseControl.NET 1.4版。每当开发人员签入代码时,都会进行编译

现在我们可以开始向测试人员提供我们的应用程序了。我们希望使用ClickOnce来分发应用程序,其想法是当测试人员去测试应用程序时,他们拥有最新的版本


我无法通过CruiseControl.NET找到实现这一点的方法。我们正在使用MSBUILD执行生成。

您希望在MSBUILD中使用ClickOnce清单生成任务。这个过程有点冗长,所以我只想给大家指出几个链接。以下是希望让您开始学习的方法和步骤。

我们已经完成了这项工作,可以为您提供一些开始学习的指导

你应该注意的两件事:

  • MSBuild可以为您生成必要的部署文件
  • MSBuild不会将文件部署到FTP或UNC共享。你需要一个单独的步骤
要使用MSBuild生成ClickOnce清单,需要发出以下命令:

msbuild /target:publish /p:Configuration=Release /p:Platform=AnyCPU; "c:\yourProject.csproj"
这将告诉MSBuild生成项目并在bin\Release\YourProject.publish目录中生成ClickOnce部署文件

剩下的就是将这些文件复制到FTP/UNC共享/任何地方,一切都已就绪

您可以告诉CruiseControl.NET使用这些MSBuild参数进行生成


然后需要一个CruiseControl.NET构建任务来获取生成的部署文件并将其复制到FTP或UNC共享。我们使用一个定制的小型C#控制台程序来实现这一点,但您也可以轻松地使用Powershell脚本。

我记得去年我为一个ClickOnce项目做过这项工作。我记得我花了很长时间才弄明白,但事实就是这样。我想让我的脚本做的是生成一个指向我们的dev env的不同安装程序和一个针对prod的不同安装程序。不仅如此,我还需要它来注入正确的版本控制信息,以便现有客户机“意识到”有一个新版本,这就是clickOnce的全部意义。 在此脚本中,您必须用自己的服务器名称等替换。诀窍是保存publish.htm和project.publish文件,并根据CC.NET提供给您的版本注入新版本号

以下是我的构建脚本的外观:

<target name="deployProd">
  <exec program="<framework_dir>\msbuild.exe" commandline="<project>/<project>.csproj /property:Configuration=PublishProd /property:ApplicationVersion=${build.label}.*;PublishUrl=\\<prod_location>\binups$\;InstallUrl=\\<prod_location>\binups$\;UpdateUrl=\\<prod_location>\binups$\;BootstrapperComponentsUrl=\\<prod_location>\prereqs$\ /target:publish"/>

  <copy todir="<project>\bin\PublishProd\<project>.publish">

    <fileset basedir=".">
      <include name="publish.htm"/>
    </fileset>

    <filterchain>
      <replacetokens>
        <token key="CURRENT_VERSION" value="${build.label}"/>
      </replacetokens>
     </filterchain>
  </copy>

</target>


希望这有帮助

谢谢你的帮助。我们实现的最终解决方案从每个答案中提取了一点

我们发现使用简单的批处理文件处理多个环境更容易。我并不是说这是最好的方法,但是对于我们给定的场景和需求,这很有效。用项目名称补充“项目”,用环境名称补充“环境”(开发、测试、阶段、生产等等)

这里是“ccnet.config”文件的任务区域

最后,这里是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开发人员希望的那样工作,但它确实工作了。如果你昨天需要让它工作,它可能是你正在寻找的解决方案。祝你好运

只要能够在CCNET.config msbuild任务中传递${CCNetLabel}就会有很大的改进。

我只想指出,这有点过时了。假设您的帖子是正确的,MSBuild已更新为支持部署到UNC共享,我现在在许多活动项目中都这样做了。谢谢,James。是的,这个问题最初是在2008年得到回答的,当时所有这些都是新鲜和性感的;7年后可能与此无关。
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
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