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=""$(NugetV4Path)\nuget.exe" pack "$(MSBuildProjectDirectory)\$(PackageId).csproj" -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 ...
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
\$(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 "$(MSBuildProjectDirectory)\$(PackageId).csproj" --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>
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.
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.
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 "mysource" -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.