提问人:elzen 提问时间:2/8/2019 最后编辑:elzen 更新时间:6/20/2019 访问量:2267
*.wpp.targets 在发布干净的解决方案时被忽略
*.wpp.targets is ignored when publishing a clean solution
问:
当我首次发布包含 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\用户名\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
在其他项目中,我们注意到一些通配符似乎适用于大多数文件,但不适用于所有文件。这方面的一个例子是:“”大多数 pdb 文件或排除但不是全部文件。<ExcludeFromPackageFiles Include="bin\*.pdb">
我想在我们的构建服务器上使用它,其中构建总是从一个干净的解决方案开始。这个问题似乎是 msbuild 中的一个错误,但如果你知道解决方案,请与我分享。
更新 2
我执行的其中一项测试的步骤:
- 在 Visual Studio Enterprise 2017(版本 15.9.7)中创建新的空 ASP.Net Web 应用程序 (.NET Framework 4.6.1) 项目。
- 将 [ProjectName] .wpp.targets 添加到包含前面描述的数据的项目中。
- 安装 nuget 包 Newtonsoft.Json(版本 12.0.1)(用作示例)
- 我在命令提示符下运行以下命令:“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
- 我查看了 C:\test\bin 文件夹,发现了以下文件:
- Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
- Newtonsoft.Json.dll
- Newtonsoft.Json.pdb
- [项目名称].dll
- [项目名称].pdb 但是不应发布 Newtonsoft.Json.dll 和 Newtonsoft.Json.pdb 文件。
- 我再次运行 msbuild 命令,它按预期工作。我在发布文件夹中只得到了以下文件:
- Microsoft.CodeDom.Providers.DotNetCompilerPlatform.dll
- [项目名称].dll
- [项目名称].pdb
- 我在我的Visual Studio实例中或通过msbuild命令做了一个干净的解决方案:“C:\Program Files (x86)\Microsoft Visual Studio\2017\Enterprise\MSBuild\15.0\Bin\msbuild.exe” WebApplication7wpp.csproj -target:Clean
- 再次运行 msbuild build 命令,然后再次添加 Newtonsoft 文件。
当我不使用通配符时,wpp.targets 按预期工作。
答:
这似乎是由于我们缺少对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 文件夹中记录第一次发布: 在新文件夹中记录第二次发布: 如上所示。
第一次发布将我们排除的文件复制到 obj,第二次发布有一个删除操作,这就是它第二次运行良好的原因,正如您上面在 Update2 中提到的。到目前为止,排除不起作用的原因尚不清楚。它可能是由运行时的调用顺序或 msbuild 本身引起的。
替代解决方法:
我知道你想要一个干净的发布。它在我身边工作,并且由于它是本地构建的,在我们发布之前不会影响发布过程,因此您可以获得想要的干净且成功的发布。
希望它有效。So, before we use the publish command, we can use a simple build command or rebuild command locally.
评论
可能对其他人有帮助的还有以下几点:
添加 .targets 文件后:关闭并重启 Visual Studio。Visual Studio 在运行时缓存 .target 内容,因此更改根本不会产生任何影响。
评论