Lancer Target après la publication des fichiers dans le système de fichiers

j'essaie de créer le profil publish qui copierait tous les fichiers publiés dans divers dossiers. Malheureusement, j'ai lu que ce n'est pas possible de le faire directement à travers publishUrl et il est conseillé de publier dans un dossier à partir de laquelle copier tous les fichiers. J'ai réussi à écrire la fonctionnalité de cible de copie, mais l'ordre de quand les cibles sont lancées est erroné. J'essaie de lancer la publication directement à partir de VisualStudio 2015, par le biais de Build > Publish Web.

Voici mon publier le profil:

<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>

L'ordre dans lequel il est exécuté comme suit:

Build
AdditionalResources
CopyToDeployFolders
Publish folder

ce qui est problématique, car mon dossier temp n'est pas encore créé/publié. J'ai essayé de faire ma cible CopyToDeployFolders pour outrepasser AfterPublish et j'ai essayé d'utiliser différents AfterTargets différents, mais aucun d'entre eux n'a fonctionné - parfois ma cible n'a pas été exécutée ou est exécutée avant de publier le dossier.

j'ai essayé de découvrir qui la cible est lancée en regardant c:Program fichiers (x86)MSBuildMicrosoftVisualStudiov14.0WebMicrosoft.Web.Publier.cible comme indiqué dans cette réponse pourquoi MSBuild ignore-t-il mon objectif avant publication? , mais n'a pas trouvé le bon, essayé de changé AfterTarget différentes, mais les résultats sont toujours les mêmes.

Edit: Sortie avec niveau de Diagnostic:

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>

Edit 2: Ajout de contenu de AdditionalResources.cibles

<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>
0
demandé sur CrudaLilium 2017-08-09 09:19:07

1 réponses

j'ai essayé de faire ma cible Copytodeployders pour outrepasser AfterPublish et essayé d'utiliser différents AfterTargets différents, mais aucun d'eux n'a fonctionné

après avoir testé le dossier de projet avec la verbosité de msbuild réglé au détail. J'ai obtenu le même résultat que vous. Puis j'ai trouvé que la cible personnalisée CopyToDeployFolders a été exécutée après le fichier de copie à obj\Release\Package\PackageTmp mais avant la publication du dossier . Tout comme l'ordre que vous avez obtenu.

Build
AdditionalResources
CopyToDeployFolders
Publish folder

après une enquête plus approfondie, j'ai trouvé une réponse officielle:

" nous ne supportons pas actuellement l'exécution de cibles personnalisées après publication à partir de VS pour le protocole du système de fichiers. Si vous publiez en ligne de commande la cible sera exécuté."

en outre, tout comme nous avons vu la fenêtre de sortie log in, la cible personnalisée CopyToDeployFolders a été exécutée après copier le fichier en obj\Release\Package\PackageTmp . Comme solution de contournement, vous pouvez copier tous les fichiers du dossier " obj\Release\Package\PackageTmp "plutôt que le dossier de publication" obj\Package\PackageTemp ", alors le problème est résolu.

il suffit donc de changer <PublishedFiles Include="obj\Package\PackageTemp\**\*" /> en:

<ItemGroup>
  <PublishedFiles Include="obj\Debug\Package\PackageTmp\**\*" />
</ItemGroup>
3
répondu Leo Liu-MSFT 2017-08-10 04:48:59