2017-07-26 6 views
2

J'ai essayé de mettre à jour la propriété ApplicationVersion dans mon fichier csproj. J'ai ajouté une cible qui exécute une tâche personnalisée pour extraire le AssemblyFileVersion de mon assemblyinfo.cs; cela fonctionne, il n'y a aucun doute à ce sujet. Mais quand je veux utiliser ma version ApplicationVersion mise à jour pour déterminer où placer mes nouveaux fichiers de construction, j'obtiens la valeur par défaut définie dans la propriété.MSBuild Mettre à jour la propriété dans csproj

<PropertyGroup> 
     ... 
     <ApplicationVersion>1.0.0.0</ApplicationVersion> 
     ... 
</PropertyGroup> 
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> 
     <PlatformTarget>AnyCPU</PlatformTarget> 
     <DebugSymbols>true</DebugSymbols> 
     <DebugType>full</DebugType> 
     <Optimize>false</Optimize> 
     <OutputPath>..\media-converter-BUILD\debug\$(ApplicationVersion)\</OutputPath> 
     <DefineConstants>DEBUG;TRACE</DefineConstants> 
     <ErrorReport>prompt</ErrorReport> 
     <WarningLevel>4</WarningLevel> 
     <DocumentationFile>..\media-converter-BUILD\debug\$(ApplicationVersion)\MediaConverter.XML</DocumentationFile> 
    </PropertyGroup> 

Mes cibles

<UsingTask AssemblyFile="GetAssemblyFileVersion.dll" TaskName="GetAssemblyFileVersion.GetAssemblyFileVersion" /> 
    <Target Name="MainAfterCompile"> 
     <CallTarget Targets="AfterCompile" /> 
     <CallTarget Targets="VerifyParam" /> 
    </Target> 
    <Target Name="AfterCompile"> 
     <GetAssemblyFileVersion strFilePathAssemblyInfo="Properties\AssemblyInfo.cs"> 
      <Output TaskParameter="strAssemblyFileVersion" PropertyName="ApplicationVersionModded" /> 
     </GetAssemblyFileVersion> 
     <PropertyGroup> 
      <ApplicationVersion>$(ApplicationVersionModded)</ApplicationVersion> 
     </PropertyGroup> 
    </Target> 

    <Target Name="VerifyParam"> 
     <Message Text="New $(ApplicationVersionModded)" Importance="high"/> 
     <Message Text="Old Updated $(ApplicationVersion)" Importance="high"/> 
    </Target> 

le GetAssemblyFileVersion.dll i plus ou moins volé de certains après je l'ai trouvé sur internet, juste ne le trouve pas encore, donc je peux » t ajouter un lien, désolé. Ma théorie sur la raison pour laquelle cela ne fonctionne pas est que les transformations et les paramètres dans PropertyGroups sont rendus avant que InitailTagets et DefaultTargets soient exécutés. Et là pour vous mon plan ne marchera jamais

mais si quelqu'un connaît un moyen de le faire fonctionner, je vous en sera reconnaissant ici il

Répondre

0

Ma théorie sur la raison pour laquelle il ne fonctionne pas est que les transformations et les paramètres dans PropertyGroups est rendu avant InitailTagets et DefaultTargets est exécuté en effet, c'est ainsi que le evaluation order fonctionne: msbuild évalue les propriétés globales dans la première passe du fichier, vous définissez OutputPath, qui est utilisé par le fichier Microsoft.Common.CurrentVersion.targets à dérive OutDir/BaseIntermediateOutputPath/.... Ensuite, dans un autre passage, vos cibles s'exécutent et mettent à jour le numéro de version, mais il n'y a pas d'autre passage qui évalue à nouveau la propriété globale OutputPath. Vous pouvez toutefois remplacer la valeur de OutputPath et les chemins dérivés dans une cible, et cela prendra effet, il vous suffit de prendre soin de l'exécuter tôt dans la construction afin que les autres cibles utilisent la version mise à jour. Cela fait l'affaire:

<Target Name="GetApplicationVersion"> 
    <GetAssemblyFileVersion strFilePathAssemblyInfo="Properties\AssemblyInfo.cs"> 
    <Output TaskParameter="strAssemblyFileVersion" PropertyName="ApplicationVersion" /> 
    </GetAssemblyFileVersion> 
</Target> 
<Target Name="SetOutputPaths" DependsOnTargets="GetApplicationVersion" 
     BeforeTargets="PrepareForBuild"> 
    <PropertyGroup> 
    <OutputPath>bin\$(Configuration)\$(ApplicationVersion)\</OutputPath> 
    <OutDir>$(OutputPath)</OutDir> 
    </PropertyGroup> 
    <Message Text="Set OutDir to $(OutDir)" Importance="high" /> 
</Target> 

Une autre façon de faire face à ce fait des choses dans l'autre sens: définir la version de l'application en tant que propriété globale msbuild, puis utilisez pour définir OutputPath et mettre à jour le numéro dans AssemblyVersion. cs avant qu'il ne soit compilé.

+0

Merci compagnon; Vous venez de me sauver d'utiliser 1 jour d'écriture d'un outil pour le faire pour moi. –