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

问题描述 投票:1回答:2

当我第一次发布包含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>

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

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

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


更新2

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

  1. 在Visual Studio Enterprise 2017(版本15.9.7)中创建一个新的空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 [项目]的.dll [projectName] .pdb但是不应发布Newtonsoft.Json.dll和Newtonsoft.Json.pdb文件。
  6. 我再次运行msbuild命令,它按预期工作。我只在publish文件夹中获得以下文件: 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 -target:清洁
  8. 再次运行msbuild build命令,再次添加Newtonsoft文件。

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

c# visual-studio msbuild target msbuild-wpp
2个回答
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.It在我这边工作,因为它是一个本地构建,在我们发布它之前不会影响发布过程,你可以得到一个干净,成功的发布。希望它有效。


0
投票

对他人有帮助的还有以下几点:

添加.targets文件后:关闭并重新启动visual studio。 Visual Studio在运行时会缓存.target的东西,所以变化根本没有效果。

© www.soinside.com 2019 - 2024. All rights reserved.