Visual studio 2015 将文件发布到文件系统后运行目标

Visual studio 2015 将文件发布到文件系统后运行目标,visual-studio-2015,msbuild,publish,Visual Studio 2015,Msbuild,Publish,我正在尝试创建发布配置文件,它会将所有发布的文件复制到不同的文件夹中。不幸的是,我读到无法通过publishUrl直接执行此操作,建议发布到一个文件夹,从中复制所有文件。我设法编写了复制目标功能,但目标运行的顺序是错误的。 我正试图通过构建>发布Web直接从VisualStudio 2015运行发布 以下是我的发布配置文件: <Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2

我正在尝试创建发布配置文件,它会将所有发布的文件复制到不同的文件夹中。不幸的是,我读到无法通过
publishUrl
直接执行此操作,建议发布到一个文件夹,从中复制所有文件。我设法编写了复制目标功能,但目标运行的顺序是错误的。 我正试图通过构建>发布Web直接从VisualStudio 2015运行发布

以下是我的发布配置文件:

<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>obj\Package\PackageTemp</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="obj\Package\PackageTemp\**\*" />
    </ItemGroup>
    <Message Importance="high" Text="FilesToCopy: @(PublishedFiles)" />
    <PropertyGroup>
      <_DeployPathIdentity>%(DestLocations.Identity)</_DeployPathIdentity>
    </PropertyGroup>
    <Copy SourceFiles="@(PublishedFiles)" DestinationFiles="@(PublishedFiles->'$(_DeployPathIdentity)%(RecursiveDir)%(Filename)%(Extension)')" />
  </Target>
</Project>
这是有问题的,因为我的临时文件夹尚未创建/发布。我试图使我的CopyToDeployFolders目标覆盖AfterPublish,并尝试使用各种不同的AfterTargets,但它们都不起作用-有时我的目标未执行或仍在publish文件夹之前运行

我试图通过观察来找出哪个目标在运行 c:\Program Files(x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.targets 如此答案所示,但没有找到正确的答案,尝试将后目标更改为不同的后目标,但结果仍然相同

编辑: 具有诊断级别的输出:

2>    Target "GatherAllFilesToPublish" in file "C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.targets" from project "C:\MyProject\MySite\MySite.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: 添加了AdditionalResources.targets的内容

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="AdditionalResources">
    <ItemGroup>
      <AddFiles Include="$(ProjectDir)\App_Themes\**\Basic\Dynamic.css">
        <CustomPath>App_themes\</CustomPath>
      </AddFiles>
      <AddFiles Include="C:\y\SharedDLL\Clients\Web\bin\**\*.dll">
        <CustomPath>bin\</CustomPath>
      </AddFiles>
      <AddFiles Include="C:\y\SharedDLL\Clients\Web\resources\**\ctrl_res\**\*.*" />
      <AddFiles Include="C:\y\SharedDLL\Clients\Web\resources\js\**\*.*">
        <CustomPath>js\</CustomPath>
      </AddFiles>
      <AddFiles Include="C:\y\SharedDLL\Clients\Web\resources\**\ClientBin\**\*.xap" />
      <AddFiles Include="C:\y\SharedDLL\Clients\Web\resources\FileUpload\**\*.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>

应用程序主题\
垃圾箱\
js\
js\
%(AddFiles.CustomPath)%(递归目录)%(文件名)%(扩展名)
我试图使我的CopyToDeployFolders目标覆盖AfterPublish,并尝试使用各种不同的AfterPublish目标,但没有一个成功

测试项目文件后,将msbuild verbosity设置为detail。我得到了和你一样的结果。然后我发现自定义目标
CopyToDeployFolders
是在将文件复制到
obj\Release\Package\PackageTmp
之后,但在发布文件夹之前执行的。就像你收到的订单一样

Build
AdditionalResources
CopyToDeployFolders
Publish folder
经过进一步调查,我发现官方的回应是:

“对于文件系统协议,我们当前不支持在从VS发布后执行自定义目标。但是,如果从命令行发布,则将执行目标。”

此外,正如我们看到的登录输出窗口一样,在将文件
复制到
obj\Release\Package\PackageTmp
之后,执行了自定义目标
CopyToDeployFolders
。作为一种解决方法,您可以从文件夹“
obj\Release\Package\PackageTmp
”而不是发布文件夹“
obj\Package\PackageTemp
”复制所有文件,然后问题就解决了

所以只需将
更改为:

<ItemGroup>
  <PublishedFiles Include="obj\Debug\Package\PackageTmp\**\*" />
</ItemGroup>


在将msbuild verbosity设置为diagnostic的情况下运行,它将显示所有目标,然后只选择适当的一个用于后目标。@stijn尝试过,但在文件开始发布时没有目标。更新了我的问题,但没有输出。@Crudalium,我用您的发布配置文件创建了一个示例,测试后我发现目标CopyToDeployFolders是在发布后执行的(我对目标AdditionalResources进行注释,因为我没有AdditionalResources.targets文件)。因此,您是否介意与我们共享onedrive提供的AdditionalResources.targets文件或测试样本,在此处共享链接,这样我们就可以重现此问题。@Leo MSFT用AdditionalResources.targets的内容更新了我的问题。由于该文件不太大,它应该添加不属于项目的其他文件,但这些文件是网站所必需的。我没有包括它,因为我认为它与问题无关,我将尝试删除它并再次发布,以查看它是否影响订单。注释了导入和使用附加资源目标,以及将后目标更改为“CopyToDeployFolders”,但顺序仍然相同。似乎我的所有目标都在GathereAllFilesToPublish目标中运行,CopyToDeployFolders也是其中的一部分,但文件是在它之后发布的。感谢您的解决方案,它可以工作,而且非常好,因为我需要从VS运行它。我也尝试从控制台运行,它确实是在发布之后运行的,但是,由于我们正试图摆脱许多批处理文件,我将采用解决方法。
<ItemGroup>
  <PublishedFiles Include="obj\Debug\Package\PackageTmp\**\*" />
</ItemGroup>