我正在尝试创建发布配置文件,该配置文件会将所有已发布的文件复制到各个文件夹。不幸的是,我读到这不可能直接通过publishUrl
来完成,建议发布到一个文件夹,从中复制所有文件。我设法编写了复制目标功能,但是运行目标的顺序是错误的。 我正在尝试直接从VisualStudio 2015通过Build> Publish Web运行发布。
这是我的发布配置文件:
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<WebPublishMethod>FileSystem</WebPublishMethod>
<LastUsedBuildConfiguration>Debug</LastUsedBuildConfiguration>
<LastUsedPlatform>Any CPU</LastUsedPlatform>
<SiteUrlToLaunchAfterPublish />
<LaunchSiteAfterPublish>False</LaunchSiteAfterPublish>
<ExcludeApp_Data>True</ExcludeApp_Data>
<publishUrl>objPackagePackageTemp</publishUrl>
<DeleteExistingFiles>True</DeleteExistingFiles>
<ExcludeFilesFromDeployment>Web.config;package.json;packages.config;Typescript**;DynamicCss**;gulpfile.js;</ExcludeFilesFromDeployment>
</PropertyGroup>
<Import Project="AdditionalResources.targets" />
<PropertyGroup>
<CopyAllFilesToSingleFolderForPackageDependsOn>AdditionalResources</CopyAllFilesToSingleFolderForPackageDependsOn>
</PropertyGroup>
<ItemGroup>
<DestLocations Include="D:PUBLISH_TEST" />
<DestLocations Include="D:PUBLISH_TEST2" />
</ItemGroup>
<Target Name="CopyToDeployFolders" AfterTargets="CopyAllFilesToSingleFolderForPackage" Outputs="%(DestLocations.Identity)">
<ItemGroup>
<PublishedFiles Include="objPackagePackageTemp***" />
</ItemGroup>
<Message Importance="high" Text="FilesToCopy: @(PublishedFiles)" />
<PropertyGroup>
<_DeployPathIdentity>%(DestLocations.Identity)</_DeployPathIdentity>
</PropertyGroup>
<Copy SourceFiles="@(PublishedFiles)" DestinationFiles="@(PublishedFiles->'$(_DeployPathIdentity)%(RecursiveDir)%(Filename)%(Extension)')" />
</Target>
</Project>
它的运行顺序如下:
Build
AdditionalResources
CopyToDeployFolders
Publish folder
这是有问题的,因为我的临时文件夹尚未创建/发布。我试图使我的 CopyToDeployFolder 目标覆盖发布后,并尝试使用各种不同的 AfterTarget,但它们都不起作用 - 有时我的目标没有执行或在发布文件夹之前仍在运行。
我试图通过查看来找出运行哪个目标 c:\Program Files (x86(\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.targets 如这个答案所示,为什么MSBuild忽略了我的BeforePublish目标?,但没有找到正确的目标,试图将AfterTarget更改为不同的目标,但结果仍然相同。
编辑: 具有诊断级别的输出:
2> Target "GatherAllFilesToPublish" in file "C:Program Files (x86)MSBuildMicrosoftVisualStudiov14.0WebMicrosoft.Web.Publishing.targets" from project "C:MyProjectMySiteMySite.csproj" (entry point):
2> Done building target "GatherAllFilesToPublish" in project "MySite.csproj".
2>Done building project "MySite.csproj".
2>Deleting existing files...
2>Publishing folder /...
... files being published ...
2>Web App was published successfully file:///C:/MyProject/MySite/MySite/obj/Package/PackageTemp
2>
编辑2: 添加了附加资源目标的内容
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Target Name="AdditionalResources">
<ItemGroup>
<AddFiles Include="$(ProjectDir)App_Themes**BasicDynamic.css">
<CustomPath>App_themes</CustomPath>
</AddFiles>
<AddFiles Include="C:ySharedDLLClientsWebbin***.dll">
<CustomPath>bin</CustomPath>
</AddFiles>
<AddFiles Include="C:ySharedDLLClientsWebresources**ctrl_res***.*" />
<AddFiles Include="C:ySharedDLLClientsWebresourcesjs***.*">
<CustomPath>js</CustomPath>
</AddFiles>
<AddFiles Include="C:ySharedDLLClientsWebresources**ClientBin***.xap" />
<AddFiles Include="C:ySharedDLLClientsWebresourcesFileUpload***.js">
<CustomPath>js</CustomPath>
</AddFiles>
<!-- Minified files should be copied last to override non-minified ones -->
<AddFiles Include="$(ProjectDir)MINIFIED_FILES***.*" />
</ItemGroup>
<ItemGroup>
<FilesForPackagingFromProject Include="%(AddFiles.Identity)">
<DestinationRelativePath>%(AddFiles.CustomPath)%(RecursiveDir)%(Filename)%(Extension)</DestinationRelativePath>
</FilesForPackagingFromProject>
</ItemGroup>
</Target>
</Project>
我试图使我的 CopyToDeployFolder 目标覆盖 AfterPublish,并尝试使用各种不同的 AfterTarget,但没有一个有效
测试项目文件后,将 msbuild 详细程度设置为详细信息。我得到了和你一样的结果。然后我发现自定义目标CopyToDeployFolders
是在将文件复制到objReleasePackagePackageTmp
之后但在发布文件夹之前执行的。就像你得到的订单一样。
Build
AdditionalResources
CopyToDeployFolders
Publish folder
经过进一步调查,我找到了官方回复:
"我们目前不支持在从VS发布文件系统协议后执行自定义目标。但是,如果从命令行发布,则将执行目标。
此外,正如我们在输出窗口中看到的日志一样,自定义目标CopyToDeployFolders
是在将文件复制到objReleasePackagePackageTmp
后执行的。作为一种解决方法,您可以从文件夹"objReleasePackagePackageTmp
"而不是发布文件夹"objPackagePackageTemp
"复制所有文件,然后问题就解决了。
所以只需要将<PublishedFiles Include="objPackagePackageTemp***" />
更改为:
<ItemGroup>
<PublishedFiles Include="objDebugPackagePackageTmp***" />
</ItemGroup>