当我第一次发布包含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
我执行的其中一项测试的步骤:
当我不使用通配符时,wpp.targets可以按预期工作。
答案 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文件夹中 希望能帮助到你。任何更新请在这里分享。
自从我重现了此问题并进行了一些测试以来,现在我更新了一些新发现。
描述:这种情况很奇怪。所以我检查了构建日志。 可以通过以下图片找到导致此问题的原因:
登录首次在TestMe文件夹中发布: 记录第二次在新文件夹中发布: 如上所示,第一个发布将我们排除的文件复制到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内容时会对其进行缓存,因此更改根本不起作用。