Pourquoi MSBuild ignore-t-il ma cible BeforePublish?

je dois manquer quelque chose d'évident ici, mais j'ai ceci à la fin de mon ASP.NET MVC Web project's .csproj file:

    [...]
    <Target Name="BeforePublish">
        <Error Condition="'foo'=='foo'" Text="test publish error" />
    </Target>
</Project>

autant que je sache, cela devrait toujours causer l'échec de la publication avec une erreur. Pourtant, si je charge le projet, clic-droit dessus et cliquez sur "Publier", la chose la publie sans accroc. Ce qui me manque?

9
demandé sur Peter Mortensen 2012-10-15 20:10:41

3 réponses

la réponse que j'ai finalement trouvé qui fonctionne bien pour Visual Studio 2010 et Visual Studio 2012; mettez cela juste avant la fin de votre application web .csproj dossier:

<Project...
    [...]
    <!-- The following makes sure we can't accidentally publish a non-Release configuration from within Visual Studio -->
    <Target Name="PreventNonReleasePublish2010" BeforeTargets="PipelinePreDeployCopyAllFilesToOneFolder" Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='10.0'">
        <Error Condition="'$(Configuration)'!='Release'" Text="When publishing from Visual Studio 2010, you must publish the Release configuration!" />
    </Target>
    <Target Name="PreventNonReleasePublish2012" BeforeTargets="MSDeployPublish" Condition="'$(BuildingInsideVisualStudio)'=='true' AND '$(VisualStudioVersion)'=='11.0'">
        <Error Condition="'$(Configuration)'!='Release'" Text="When publishing from Visual Studio 2012, you must publish the Release configuration!" />
    </Target>
</Project>

Lire la suite pour voir ma pensée derrière cette réponse, mais fondamentalement, il tourne autour du fait que Visual Studio 2010 définit la PipelinePreDeployCopyAllFilesToOneFolder cible à accrocher à, et Visual Studio 2012 définit la plus" standard " MSDeployPublish cible à accrocher à.

le code ci-dessus ne permet de déployer la publication que dans une configuration Release depuis Visual Studio, mais il pourrait facilement être modifié pour empêcher toute de déployer la publication depuis Visual Studio.

AFAIR, "Publier" à partir de Visual Studio 2010 menu contextuel appelle webdeploy\msdeploy outil. J'ai un peu joué avec, mais je n'aimais pas du tout. Si vous voulez toujours utiliser cette fonctionnalité et insérer votre cible quelque part - vous avez besoin pour connaître la cible exacte et sa propriété de dépendance.

Check c:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets

vous trouverez deux tâches - MSDeploy et VSMSDeploy. Ce dernier semble bon pour moi. Le premier n'est pas utilisé dans ce fichier. Mais VSMSDeploy utilisé dans trois cibles différentes, PackageUsingManifest, TestDeployPackageToLocal et MSDeployPublish. Encore une fois ce dernier sonne bien ;)

<Target Name="MSDeployPublish" DependsOnTargets="$(MSDeployPublishDependsOn)">

donc vous avez juste besoin de passer outre un propriété. Mettez ceci avant votre cible et" Votretargetname " sera appelé juste avant MSDeployPublish.

<PropertyGroup>
    <MSDeployPublishDependsOn Condition="'$(MSDeployPublishDependsOn)'!=''">
        $(MSDeployPublishDependsOn);
        YourTargetName;
    </MSDeployPublishDependsOn>
  </PropertyGroup>

si vous êtes déjà passé à MSBuild 4.0, il y a un moyen plus facile d'accrocher votre cible. Vous avez juste besoin de spécifier l'attribut BeforeTarget . Dans notre cas, ce sera comme ceci:

  <Target Name="MyTarget" BeforeTargets="MSDeployPublish">
        <Error Condition="'foo'=='foo'" Text="test publish error" />
  </Target>

j'espère que ça aidera. Demander si vous avez plus de questions.

PS: je n'ai pas vérifié tout cela, parce que je n'ai pas tout environnement prêt à L'emploi;)

NB: je me souviens que J'ai été découragé d'utiliser MSDeploy pour nos propres produits parce qu'il était assez contre-intuitif de configurer correctement pour un intégration continue (CI) système. Peut-être que je n'étais pas très bon à ça, et ta solution fonctionnera correctement. Mais procédez avec MSDeploy soigneusement.

14
répondu Alexey Shcherbak 2015-03-30 20:37:07

Je ne suis pas sûr que cela fonctionnerait dans VS 2010 car je ne l'ai testé que dans VS 2012, mais j'ai trouvé que mettre la cible dans le (ProjectDir)/Properties/PublishProfiles/(ProfileName).pubxml fichier en tant que "AfterBuild" target fonctionne. Comme, il ne se déclenche pas lorsque vous générez le projet, mais ne déclenche lorsque vous publiez le projet.

donc au lieu de mettre

<Target Name="BeforePublish">
    <Error Condition="'foo'=='foo'" Text="test publish error" />
</Target>

dans votre .fichier csproj, essayez de mettre

<Target Name="AfterBuild">
    <Error Condition="'foo'=='foo'" Text="test publish error" />
</Target>

in votre. pubxml fichier à la place, et il devrait démarrer juste avant la publication.

2
répondu superconnected 2015-05-26 16:36:56

dans Mes fichiers de projet et sont commentés par défaut, et j'ai accidentellement ajouté un nouveau à l'intérieur des commentaires, et donc il n'a pas été appelé. Stupide erreur.

après cela j'ai obtenu la cible avant publication de travailler dans Visual Studio 2010.

<Target Name="BeforePublish">
 //insert awesome here
 </Target>

note: vous devez fournir votre propre impressionnant:)

-1
répondu ZenkeiRich 2013-01-11 09:28:21