【问题标题】:*.wpp.targets is ignored when publishing a clean solution发布干净的解决方案时忽略 *.wpp.targets
【发布时间】:2019-07-02 18:08:21
【问题描述】:

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

删除我的发布文件夹中的所有文件并再次发布后,一切都很好。 但是,当我从 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>

Roslyn 按预期被排除在外。但不排除 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

在其他项目中,我们注意到某些通配符似乎适用于大多数文件,但并非适用于所有文件。这方面的一个例子是:“&lt;ExcludeFromPackageFiles Include="bin\*.pdb"&gt;”pdb 文件最多或排除但不是全部。

我想在我们的构建服务器上使用它,构建总是从一个干净的解决方案开始。这个问题似乎是 msbuild 的一个 bug,但如果你知道解决方案,请与我分享。


更新 2

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

  1. 在 Visual Studio Enterprise 2017(版本 15.9.7)中创建一个新的 Empty ASP.Net Web Application (.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
    • [项目名称].dll
    • [项目名称].pdb 但不应发布 Newtonsoft.Json.dll 和 Newtonsoft.Json.pdb 文件。
  6. 我再次运行 msbuild 命令,它按预期工作。我在发布文件夹中只有以下文件:
    • Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
    • [项目名称].dll
    • [项目名称].pdb
  7. 我在我的 Visual Studio 实例中或通过 msbuild 命令做了一个干净的解决方案:“C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe”WebApplication7wpp.csproj -目标:清洁
  8. 再次运行 msbuild build 命令并再次添加 Newtonsoft 文件。

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

【问题讨论】:

  • 它是否有效?请给我一个反馈。如果您可以通过一个驱动器共享一个简单的示例,这样我就可以直接为您检查它会更好。
  • 有些奇怪。但是我在我身边使用 wpp.targets 示例和 MSBuild 版本 15.9.6,它运行良好。无论是 Newtonsoft.* 还是 *.pdb,它们都可以很好地排除某些文件。 (我的项目是 ASP.net Web 应用程序,4.6.1 框架,与您的文件夹结构相同)
  • 请将您的 vs 或 msbuild 更新到最新版本。还有两点要确保: 1.[ProjectName].wpp.targets 必须在 ProjectDir 而不是 SolutionDir 2.在发布之前,手动删除发布文件夹的内容或将 .pubxml 中的“DeleteExistingFiles”属性更改为 'True ' ,从以前的发布中删除效果
  • 我今天在家用电脑上试了一下。首先使用 msbuild 15.8.168,然后使用更新的版本 15.9.21。结果又是一样的。在我想逐步解释我所做的事情之前,我首先要回答@LanceLi-MSFT 提出的两点。 1. 是的,我还在我的项目中使用 wpp.target 文件而不是在解决方案中对其进行了测试(尽管我得到了相同的结果) 2. 我手动清除了我的发布文件夹,但我也使用了 DeleteExistingFiles 属性。我在我的问题中添加了更新 2,它描述了我采取的步骤。你也可以试试这些步骤吗?
  • 我按照你的步骤遇到了类似的情况。现在我想我可以完全理解你的意思了。我将添加然后更新我的答案。

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


【解决方案1】:

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

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

每次我们通过 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 文件夹中首次发布的日志: 在新文件夹中记录第二次发布: 如上所示。第一次发布将我们排除的文件复制到 obj,第二次发布具有删除操作,这就是您在上面 Update2 中提到的第二次运行良好的原因。到目前为止,exclude不起作用的原因尚不清楚。可能是运行时的调用顺序或msbuild本身的原因。

替代解决方法:

我知道你想要一个干净的发布。 So, before we use the publish command, we can use a simple build command or rebuild command locally.它在我身边工作,因为它是本地构建,在我们发布之前不会影响发布过程,你可以获得你想要的干净和成功的发布。 希望它有效。

【讨论】:

  • 感谢您的回复。我已经检查过了,但这不是我的解决方案。我还找到了有关我的问题的更多信息并更新了我的问题文本。
  • 我目前使用的解决方法是不使用通配符。我也向微软报告了这个错误。也许您可以在developercommunity.visualstudio.com/content/problem/459327/… 上投票,谢谢您的宝贵时间。
  • 我投了赞成票。希望它可以尽快修复。您可以在此处分享任何更新。
【解决方案2】:

以下内容可能对其他人也有帮助:

添加 .targets 文件后:关闭并重新启动 Visual Studio。 Visual Studio 在运行时会缓存 .target 内容,因此更改根本没有效果。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-08-12
    • 2016-11-26
    • 2010-09-18
    • 2021-03-20
    • 1970-01-01
    • 2022-11-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多