如何使 MSBuild 命令行在发布期间忽略非 ClickOnce 应用程序?
How to make MSBuild Command Line ignore non ClickOnce applications during publishing?
在我的解决方案中,我有三个可执行文件,其中两个不应通过 ClickOnce 分发,也不会生成这些文件。它们是分发给特定端的内部控制台应用程序。第三个是分发给我的最终用户的普通 ClickOnce 应用程序。
在博客上关注 this question and this tip 后,我设法从这些应用程序中删除了 ClickOnce,并从 Visual Studio 中正确构建。
但是在我的持续集成中出现问题,使用 MSBuild 命令行执行。在发布的最后步骤中,MSBuild 抛出错误,因为它没有找到其他两个可执行文件的清单,所以我的构建失败了。此外,当我检查发布输出时,它在 "Application Files" 中为包含“.exe”和“.config”文件的这两个应用程序创建了文件夹(这也是不希望的,因为它们将被自动上传并且它们不应该'不会)。
是否有参数或其他方法使 MSBuild 仅忽略那些没有 Clickonce 的项目的发布步骤?
谢谢。
您可以使用自定义目标来实现它。编辑您的项目 (csproj) 文件(右键单击项目节点 -> 卸载项目 -> 编辑 xxx.csproj)并在其上添加以下代码。
<PropertyGroup>
<!-- the folder of the project to build -->
<ProjLocation>D:\Project\Msbuild\ConsoleApplication3\ConsoleApplication1</ProjLocation>
<ProjLocationDebugDir>$(ProjLocation)\bin\Debug</ProjLocationDebugDir>
<ProjPublishLocation>$(ProjLocationDebugDir)\app.publish</ProjPublishLocation>
<!-- This is the web-folder, which provides the artefacts for click-once. After this
build the project is actually deployed on the server -->
<DeploymentFolder>D:\server\releases\</DeploymentFolder>
</PropertyGroup>
<Target Name="Test" DependsOnTargets="Clean">
<Message Text="Publish-Build started for build no $(ApplicationRevision)" />
<MSBuild Projects="$(ProjLocation)$(ProjectName).csproj"
Properties="$(DefaultBuildProperties)"
Targets="Publish"/>
<ItemGroup>
<SetupFiles Include="$(ProjPublishLocation)\*.*"/>
<UpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*"/>
</ItemGroup>
<Copy SourceFiles="@(SetupFiles)" DestinationFolder="$(DeploymentFolder)\" />
<Copy SourceFiles="@(UpdateFiles)" DestinationFolder="$(DeploymentFolder)\Application Files\%(RecursiveDir)"/>
</Target>
<Target Name="Clean">
<Message Text="Clean project" />
<MSBuild Projects="$(ProjLocation)$(ProjectName).csproj"
Properties="$(DefaultBuildProperties)"
Targets="Clean"/>
</Target>
然后,您可以使用下面的msbuild命令行。
msbuild /t:test
这里有一个demo供大家参考,请查看名为consoleapplication1的工程https://1drv.ms/u/s!AlvaNEnglADDgQRMB1LK4mo9KVXO
我通过进入 "BUILD" -> "CONFIGURATION MANAGER" 并从实际配置中删除其他可执行文件解决了我的问题。然后创建新配置以在我的解决方案需要时构建其他可执行文件。
我的 CI 任务更改为为每个项目设置配置 属性,如下所示:
项目 A -> "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:clean;build;publish /property:Configuration=ProjectA_Release;"
项目 B -> "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:clean;build;publish /property:Configuration=ProjectB_Release;"
等等...
这样我就可以将文件分开发布,而不会在单个构建中混入错误的东西。
在我的解决方案中,我有三个可执行文件,其中两个不应通过 ClickOnce 分发,也不会生成这些文件。它们是分发给特定端的内部控制台应用程序。第三个是分发给我的最终用户的普通 ClickOnce 应用程序。
在博客上关注 this question and this tip 后,我设法从这些应用程序中删除了 ClickOnce,并从 Visual Studio 中正确构建。
但是在我的持续集成中出现问题,使用 MSBuild 命令行执行。在发布的最后步骤中,MSBuild 抛出错误,因为它没有找到其他两个可执行文件的清单,所以我的构建失败了。此外,当我检查发布输出时,它在 "Application Files" 中为包含“.exe”和“.config”文件的这两个应用程序创建了文件夹(这也是不希望的,因为它们将被自动上传并且它们不应该'不会)。
是否有参数或其他方法使 MSBuild 仅忽略那些没有 Clickonce 的项目的发布步骤?
谢谢。
您可以使用自定义目标来实现它。编辑您的项目 (csproj) 文件(右键单击项目节点 -> 卸载项目 -> 编辑 xxx.csproj)并在其上添加以下代码。
<PropertyGroup>
<!-- the folder of the project to build -->
<ProjLocation>D:\Project\Msbuild\ConsoleApplication3\ConsoleApplication1</ProjLocation>
<ProjLocationDebugDir>$(ProjLocation)\bin\Debug</ProjLocationDebugDir>
<ProjPublishLocation>$(ProjLocationDebugDir)\app.publish</ProjPublishLocation>
<!-- This is the web-folder, which provides the artefacts for click-once. After this
build the project is actually deployed on the server -->
<DeploymentFolder>D:\server\releases\</DeploymentFolder>
</PropertyGroup>
<Target Name="Test" DependsOnTargets="Clean">
<Message Text="Publish-Build started for build no $(ApplicationRevision)" />
<MSBuild Projects="$(ProjLocation)$(ProjectName).csproj"
Properties="$(DefaultBuildProperties)"
Targets="Publish"/>
<ItemGroup>
<SetupFiles Include="$(ProjPublishLocation)\*.*"/>
<UpdateFiles Include="$(ProjPublishLocation)\Application Files\**\*.*"/>
</ItemGroup>
<Copy SourceFiles="@(SetupFiles)" DestinationFolder="$(DeploymentFolder)\" />
<Copy SourceFiles="@(UpdateFiles)" DestinationFolder="$(DeploymentFolder)\Application Files\%(RecursiveDir)"/>
</Target>
<Target Name="Clean">
<Message Text="Clean project" />
<MSBuild Projects="$(ProjLocation)$(ProjectName).csproj"
Properties="$(DefaultBuildProperties)"
Targets="Clean"/>
</Target>
然后,您可以使用下面的msbuild命令行。
msbuild /t:test
这里有一个demo供大家参考,请查看名为consoleapplication1的工程https://1drv.ms/u/s!AlvaNEnglADDgQRMB1LK4mo9KVXO
我通过进入 "BUILD" -> "CONFIGURATION MANAGER" 并从实际配置中删除其他可执行文件解决了我的问题。然后创建新配置以在我的解决方案需要时构建其他可执行文件。
我的 CI 任务更改为为每个项目设置配置 属性,如下所示:
项目 A -> "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:clean;build;publish /property:Configuration=ProjectA_Release;"
项目 B -> "C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe /target:clean;build;publish /property:Configuration=ProjectB_Release;"
等等...
这样我就可以将文件分开发布,而不会在单个构建中混入错误的东西。