web-dev-qa-db-fra.com

Comment exécuter la cible du pack MSBuild dans Visual Studio 2017

Ma question est similaire à ceci et ceci .

Je souhaite créer une bibliothèque .Net Framework dans Visual Studio 2017 RC. Dans VS 2015 avec le système de construction project.json, j'ai pu y parvenir en important un fichier de cibles personnalisé dans le fichier .xproj. Ce fichier de cibles personnalisé s’est occupé de la création du fichier nuspec s’il n’existait pas, de l’exécution du pack de nugets, de la copie des packages résultants vers l’emplacement du flux local, etc.

Dois-je faire quelque chose de similaire en 2017 (je n'ai pas encore fait d'effort sérieux) ou puis-je en quelque sorte activer la cible du pack dans mon fichier .csproj?

Les documents ici ne montrent que l'exécution de la cible du pack à partir de la ligne de commande. 

EDIT: J'essaie la cible personnalisée ci-dessous référençant un exe Nuget 4.0 à partir des versions nocturnes ...

<Target Name="PackNugets"  AfterTargets="Build">    
  <PropertyGroup>
    <NugetV4Path>$([System.IO.Path]::GetFullPath('path to nuget.exe'))</NugetV4Path>
  </PropertyGroup>

  <Exec Command="&quot;$(NugetV4Path)\nuget.exe&quot; pack &quot;$(MSBuildProjectDirectory)\$(PackageId).csproj&quot; -Symbols -OutputDirectory bin -Properties Configuration=Release"/>
</Target>

Mais j'obtiens l'erreur suivante

System.InvalidCastException: Unable to cast object of type 'System.String' to type 'NuGet.Frameworks.NuGetFramework'.
  at NuGet.ProjectManagement.NuGetProject.GetMetadata[T](String key)
  at NuGet.ProjectManagement.PackagesConfigNuGetProject..ctor(String folderPath, Dictionary`2 metadata)
  at CallSite.Target(Closure , CallSite , Type , Object , Dictionary`2 )
  at System.Dynamic.UpdateDelegates.UpdateAndExecute3[T0,T1,T2,TRet](CallSite site, T0 arg0, T1 arg1, T2 arg2)
  at NuGet.CommandLine.ProjectFactory.AddDependencies(Dictionary`2 packagesAndDependencies)
  at NuGet.CommandLine.ProjectFactory.ProcessDependencies(PackageBuilder builder)
  at NuGet.CommandLine.ProjectFactory.CreateBuilder(String basePath, NuGetVersion version, String suffix, Boolean buildIfNeeded, PackageBuilder builder)
  at NuGet.Commands.PackCommandRunner.BuildFromProjectFile(String path)
  at NuGet.CommandLine.PackCommand.ExecuteCommand()
  at NuGet.CommandLine.Command.ExecuteCommandAsync()
  at NuGet.CommandLine.Command.Execute()
  at NuGet.CommandLine.Program.MainCore(String workingDirectory, String[] args)

Quelque chose à voir avec l'une des propriétés du csproj? NugetFramework fait-il référence à la TargetFramework?

Je cible net452 dans mon csproj, au cas où cela aiderait.

EDIT: Cette exception concerne bien Nuget qui tente d’analyser la TargetFramework, mais il n’est pas clair si elle échoue sur mon csproj ou sur une dépendance ...

6
Ken G

EDIT: Les dernières mises à jour de VS2017 ont ajouté l'action Pack au menu contextuel du projet. L'action ci-dessous peut donc être modifiée comme suit:

  • AfterTargets=Pack
  • Supprimer l'élément Exec
  • Si vous ciblez plusieurs frameworks, vous devrez peut-être insérer une \$(Configuration) après le \bin dans le NugetPackages Include.

Ok, ce problème l'a résolu pour moi. Pour le moment, nous devons utiliser dotnet au lieu de msbuild ou nuget.

Ainsi, ma cible personnalisée dans le fichier .targets importé devient

<Project ToolsVersion="15.0">
 <Target Name="PackNugets"  AfterTargets="AfterBuild">  

  <!-- Swap out nuget for dotnet and update the cli args -->
  <!-- Might actually be able to leave out the csproj path, since
       this target should run in the project directory. Test it first. -->
  <Exec Command="dotnet pack &quot;$(MSBuildProjectDirectory)\$(PackageId).csproj&quot; --no-build --include-symbols -o bin -c Release"/>

  <!-- If you want to copy to a local feed -->
  <ItemGroup>
    <NugetPackages Include="$(MSBuildProjectDirectory)\bin\$(PackageId).$(PackageVersion)*.nupkg"/>
   </ItemGroup>

  <Copy SourceFiles="@(NugetPackages)" DestinationFolder="path to local feed" />
 </Target>  
</Project>
6
Ken G

Je voulais savoir la même chose, alors je me suis lancé dans les fichiers MSBuild, à savoir: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Sdks\NuGet.Build.Tasks.Pack\build et à rechercher la cible "Pack".

Au-delà de cela, je me référerais à la syntaxe générale de ligne de commande MSBuild ici , mais quelques exemples:

msbuild.exe -t:Pack -p:IncludeSymbols=true
msbuild.exe -t:Pack -p:Configuration=Release -p:VersionSuffix="alpha" # or "-alpha" - not sure

EDIT: Un peu plus de recherche et de travail sur mon scénario et j'ai trouvé cette documentation des propriétés importantes.

4
Adam Hewitt

Veuillez noter que dotnet pack ou msbuild /t:Pack ne prend actuellement pas en charge les projets .NET Framework. Ils ne travaillent que sur des projets NETCore.

1
rohit21agrawal

Vous pouvez même améliorer Réponse de Ken G si vous voulez pousser la nuget en utilisant ceci:

<Target Name="PushNugetPackage" AfterTargets="Pack" Condition="'$(Configuration)' == 'Release'">
  <Exec Command="nuget.exe Push -Source &quot;mysource&quot; -ApiKey VSTS $(OutputPath)..\$(PackageId).$(PackageVersion).nupkg" />
</Target>

Il ne fonctionnera qu'après que vous ayez choisi pack dans le menu contextuel et que la configuration soit définie sur Libération. Par conséquent, vous ne devez pas supprimer les packages de débogage, supprimez cette condition si vous n'en avez vraiment pas besoin.

La source

0
David Noreña