发布干净的解决方案时,* .wpp.targets被忽略

时间:2019-02-08 13:27:21

标签: c# visual-studio msbuild target msbuild-wpp

当我第一次发布包含ASP.NET Web应用程序的解决方案时,.wpp.targets文件将被忽略。 publish文件夹还包含不应发布的文件。

在删除我的发布文件夹中的所有文件并再次发布后,一切都很好。 但是,当我从Visual Studio中执行干净的解决方案时,.wpp.targets文件将再次被忽略。

希望有人可以解决此问题或解释为什么会发生这种情况。 我想在我们的构建服务器上使用它,该构建始终以一个干净的解决方案开始。

我用过的东西:

MSBuild版本15.8.166 “ C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ msbuild.exe” WebApplication1.sln / p:DeployOnBuild = true / p:DeployDefaultTarget = WebPublish / p:WebPublishMethod = FileSystem / p:publishUrl = C:\ test

MSBuild版本16.0.360 “ C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Preview \ MSBuild \ Current \ Bin \ msbuild.exe” WebApplication1.sln / p:DeployOnBuild = true / p:DeployDefaultTarget = WebPublish / p:WebPublishMethod = FileSystem / p:publishUrl = C:\ test

我使用包含我的项目名称的wpp.target文件运行了构建,但是我也使用以下MSBuild参数对其进行了尝试:/ p:WebPublishPipelineCustomizeTargetFile = C:\ Users \ username \ source \ repos \ Test \ WebApplication1 \ test.wpp.targets


更新

首次或在清理构建后生成项目时,*。wpp.targets文件中的通配符不起作用。 这是我的* .wwp.targets文件的示例:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ExcludeFromPackageFolders Include="bin\roslyn">
<FromTarget>Roslyn</FromTarget>
</ExcludeFromPackageFolders>
<ExcludeFromPackageFiles Include="bin\Newtonsoft.*">
<FromTarget>Newtonsoft</FromTarget>
</ExcludeFromPackageFiles>
</ItemGroup>
</Project>

罗斯林被排除在预期范围之外。但是不排除Newtonsoft。*,因为名称中包含通配符。

手动删除obj文件夹或在执行通配符之前执行构建时。

我使用的是: MSBuild版本15.8.166& MSBuild版本16.0.360

使用的msbuild comando的示例: “ C:\ Program Files(x86)\ Microsoft Visual Studio \ 2019 \ Preview \ MSBuild \ Current \ Bin \ msbuild.exe” WebApplicationTestForMsBuild.sln / p:DeployOnBuild = true / p:DeployDefaultTarget = WebPublish / p:WebPublishMethod = FileSystem / p:publishUrl = C:\ test

在其他项目中,我们注意到某些通配符似乎适用于大多数文件,但不适用于所有文件。这样的示例是:“ <ExcludeFromPackageFiles Include="bin\*.pdb">”是大多数pdb文件,或者排除但不是全部。

我想在我们的构建服务器上使用它,其中构建始终以干净的解决方案开始。这个问题似乎是msbuild中的错误,但是如果您知道解决方案,请与我分享。


更新2

我执行的其中一项测试的步骤:

  1. 在Visual Studio Enterprise 2017(版本15.9.7)中创建一个新的Empty ASP.Net Web应用程序(.NET Framework 4.6.1)项目。
  2. 将[ProjectName] .wpp.targets添加到包含前面描述的数据的项目中。
  3. 安装nuget包Newtonsoft.Json(版本12.0.1)(用作示例)
  4. 我在命令提示符处运行以下命令:“ C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ msbuild.exe” [projectName] .csproj / p:DeployOnBuild = true / p:DeployDefaultTarget = WebPublish / p:WebPublishMethod = FileSystem / p:publishUrl = C:\ test / p:DeleteExistingFiles = True
  5. 我查看了C:\ test \ bin文件夹,发现以下文件:
    • Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
    • Newtonsoft.Json.dll
    • Newtonsoft.Json.pdb
    • [projectName] .dll
    • [projectName] .pdb 但是不应发布Newtonsoft.Json.dll和Newtonsoft.Json.pdb文件。
  6. 我再次运行msbuild命令,它按预期工作。我在发布文件夹中仅获得以下文件:
    • Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
    • [projectName] .dll
    • [projectName] .pdb
  7. 我在Visual Studio实例中或通过msbuild命令做了一个干净的解决方案:“ C:\ Program Files(x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ MSBuild \ 15.0 \ Bin \ msbuild.exe” WebApplication7wpp.csproj -target:清洁
  8. 再次运行msbuild build命令,并再次添加Newtonsoft文件。

当我不使用通配符时,wpp.targets可以按预期工作。

2 个答案:

答案 0 :(得分:1)

  

这似乎是由于我们缺乏对wpp.targets文件的引用导致的。

要获得干净的解决方案,请打开xxx.csproj文件并检查<Content Include="test.wpp.targets" />标记中是否存在<ItemGroup>。如果没有,请手动将此句子添加到标签中。

每次使用msbuild命令发布它之前,都应确保已引用wpp.targets文件,以便可以找到它并将其部署到发布文件夹中。

此外:

1。我们可以添加/ p:DeleteExistingFiles选项。 下面的命令对我来说效果很好。

MSBuild.exe xxx.csproj /p:DeployOnBuild=True /p:DeployDefaultTarget=WebPublish /p:WebPublishMethod=FileSystem /p:DeleteExistingFiles=True /p:publishUrl=C:\test

2。确保wpp.targets位于Project文件夹中而不是Solution文件夹中 希望能帮助到你。任何更新请在这里分享。

更新1

自从我重现了此问题并进行了一些测试以来,现在我更新了一些新发现。

  

描述:这种情况很奇怪。所以我检查了构建日志。   可以通过以下图片找到导致此问题的原因:

登录首次在TestMe文件夹中发布: enter image description here 记录第二次在新文件夹中发布: enter image description here 如上所示,第一个发布将我们排除的文件复制到obj,第二个发布具有删除操作,这就是它在Update2中如上所述第二次运行良好的原因。到目前为止,排除不起作用的原因还不得而知。这可能是由于运行时的调用顺序或msbuild本身引起的。

  

替代解决方法:

我知道您想要干净的发布。 So, before we use the publish command, we can use a simple build command or rebuild command locally.在我这边起作用,并且由于它是本地构建,因此在我们发布它之前不会影响发布过程,因此您可以自由进行一次干净,成功的发布。 希望它能工作。

答案 1 :(得分:0)

以下对其他人可能也有用的东西:

添加.targets文件后:关闭并重新启动Visual Studio。 Visual Studio在运行.target内容时会对其进行缓存,因此更改根本不起作用。