当我第一次发布包含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
我执行的其中一个测试的步骤:
当我不使用通配符时,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文件夹希望它有所帮助。任何更新请在这里分享。
由于我已经复制了这个问题,并对其进行了一些测试,现在我更新了一些新的发现。
说明:这种情况很奇怪。所以我检查构建日志。我们可以通过下面的图片找到这个问题的原因:
在TestMe文件夹中记录首次发布:在新文件夹中记录第二次发布:如上所示。第一次发布将我们排除的文件复制到obj,第二次发布有一个删除操作,这就是为什么它适用于正如您在Update2中提到的第二次。到目前为止,排除不起作用的原因是未知的。它可能来自运行时的调用顺序或关于msbuild本身的某些内容。
替代解决方法:
我知道你想要一个干净的发布。 So, before we use the publish command, we can use a simple build command or rebuild command locally.
It在我这边工作,因为它是一个本地构建,在我们发布它之前不会影响发布过程,你可以得到一个干净,成功的发布。希望它有效。
对他人有帮助的还有以下几点:
添加.targets文件后:关闭并重新启动visual studio。 Visual Studio在运行时会缓存.target的东西,所以变化根本没有效果。