web-dev-qa-db-fra.com

N'incluez pas les dépendances du fichier packages.config lors de la création du package NuGet

J'utilise Nuget pour créer des packages. Je voudrais créer un package qui ne contient aucune dépendance (dans le fichier .nuspec) À tout autre package NuGet. Mon projet a des dépendances de package NuGet définies dans son fichier packages.config.

Je crée d'abord le fichier .nuspec ...

C:\code\MySolution>.nuget\nuget.exe spec MyProject\MyProject.csproj

J'édite le fichier .nuspec Généré pour qu'il soit minimal, sans dépendances.

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyProject</id>
    <version>1.2.3</version>
    <title>MyProject</title>
    <authors>Example</authors>
    <owners>Example</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Example</description>
    <copyright>Copyright 2013 Example</copyright>
    <tags>example</tags>
    <dependencies />
  </metadata>
</package>

Ensuite, je crée la solution et crée un package NuGet ...

C:\code\MySolution>.nuget\nuget.exe pack MyProject\MyProject.csproj -Verbosity detailed

Voici la sortie de cette commande ...

Attempting to build package from 'MyProject.csproj'.
Packing files from 'C:\code\MySolution\MyProject\bin\Debug'.
Using 'MyProject.nuspec' for metadata.
Found packages.config. Using packages listed as dependencies

Id: MyProject
Version: 1.2.3
Authors: Example
Description: Example
Tags: example
Dependencies: Google.ProtocolBuffers (= 2.4.1.473)

Added file 'lib\net40\MyProject.dll'.

Successfully created package 'C:\code\MySolution\MyProject.1.2.3.nupkg'.

Le package .nupkg Qui est créé contient un fichier .nuspec Mais il comprend une section de dépendances que je n'avais pas dans le fichier .nuspec D'origine ...

<dependencies>
  <dependency id="Google.ProtocolBuffers" version="2.4.1.473" />
</dependencies>

Je crois que cela se produit à cause de cela ... (à partir de la sortie ci-dessus)

Found packages.config. Using packages listed as dependencies

Comment puis-je faire NuGet pas résoudre automatiquement les dépendances et les insérer dans le fichier .nuspec Qui est généré à partir de la commande pack?

J'utilise NuGet 2.2 actuellement. En outre, je ne pense pas que ce problème se soit produit dans une ancienne version de NuGet; Est-ce une nouvelle fonctionnalité"? Je n'ai trouvé aucune documentation décrivant cette "fonctionnalité" ou quand elle a été implémentée.

52
Jesse Webb

Dans la version 2.7, il existe une option appelée developmentDependency qui peut être définie dans package.config pour éviter d'inclure la dépendance.

Excluant les dépendances de développement lors de la création de packages

<?xml version="1.0" encoding="utf-8"?>
<packages>
    <package id="jQuery" version="1.5.2" />
    <package id="netfx-Guard" version="1.3.3.2" developmentDependency="true" />
    <package id="Microsoft-web-helpers" version="1.15" />
</packages>
46
David C

Empêchez votre package de dépendre d'autres packages

Depuis NuGet 2.7 il y a un nouvel attribut developmentDependency qui peut être ajouté à un nœud package dans le _ de votre projet packages.config fichier . Donc, si votre projet inclut un package NuGet que vous ne souhaitez pas que votre package NuGet inclue comme dépendance, vous pouvez utiliser cet attribut comme suit:

<?xml version="1.0" encoding="utf-8"?>
<packages>
  <package id="CreateNewNuGetPackageFromProjectAfterEachBuild" version="1.8.1-Prerelease1" targetFramework="net45" developmentDependency="true" />
</packages>

Le bit important que vous devez ajouter ici est developmentDependency="true".

Empêchez votre package de développement de dépendre d'autres packages

Si vous créez un package de développement NuGet pour les autres utilisateurs, que vous savez qu'ils ne voudront pas avoir comme dépendance dans leurs packages, vous pouvez éviter aux utilisateurs d'avoir à ajouter manuellement cet attribut à leur fichier packages.config en utilisant le - attribut NuGet 2.8 developmentDependency dans la section métadonnées de votre fichier .nuspec . Cela ajoutera automatiquement l'attribut developmentDependency au fichier packages.config lorsque votre package est installé par d'autres. Le problème ici est qu'il nécessite que l'utilisateur ait au moins NuGet 2.8 installé. Heureusement, nous pouvons utiliser l'attribut NuGet 2.5 minClientVersion pour nous assurer que les utilisateurs ont au moins v2.8 installé; sinon, ils seront informés qu'ils doivent mettre à jour leur client NuGet avant de pouvoir installer le package.

J'ai un package de développement NuGet pour lequel c'était parfait. Voici à quoi ressemble mon fichier .nuspec, montrant comment utiliser les attributs minClientVersion et developmentDependency (lignes 3 et 20 respectivement):

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.Microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata minClientVersion="2.8">
    <id>CreateNewNuGetPackageFromProjectAfterEachBuild</id>
    <version>1.8.1-Prerelease1</version>
    <title>Create New NuGet Package From Project After Each Build</title>
    <authors>Daniel Schroeder,iQmetrix</authors>
    <owners>Daniel Schroeder,iQmetrix</owners>
    <licenseUrl>https://newnugetpackage.codeplex.com/license</licenseUrl>
    <projectUrl>https://newnugetpackage.codeplex.com/wikipage?title=NuGet%20Package%20To%20Create%20A%20NuGet%20Package%20From%20Your%20Project%20After%20Every%20Build</projectUrl>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Automatically creates a NuGet package from your project each time it builds. The NuGet package is placed in the project's output directory.
    If you want to use a .nuspec file, place it in the same directory as the project's project file (e.g. .csproj, .vbproj, .fsproj).
    This adds a PostBuildScripts folder to your project to house the PowerShell script that is called from the project's Post-Build event to create the NuGet package.
    If it does not seem to be working, check the Output window for any errors that may have occurred.</description>
    <summary>Automatically creates a NuGet package from your project each time it builds.</summary>
    <releaseNotes>- Changed to use new NuGet built-in method of marking this package as a developmentDependency (now requires NuGet client 2.8 or higher to download this package).</releaseNotes>
    <copyright>Daniel Schroeder 2013</copyright>
    <tags>Auto Automatic Automatically Build Pack Create New NuGet Package From Project After Each Build On PowerShell Power Shell .nupkg new nuget package NewNuGetPackage New-NuGetPackage</tags>
    <developmentDependency>true</developmentDependency>
  </metadata>
  <files>
    <file src="..\New-NuGetPackage.ps1" target="content\PostBuildScripts\New-NuGetPackage.ps1" />
    <file src="Content\NuGet.exe" target="content\PostBuildScripts\NuGet.exe" />
    <file src="Content\BuildNewPackage-RanAutomatically.ps1" target="content\PostBuildScripts\BuildNewPackage-RanAutomatically.ps1" />
    <file src="Content\UploadPackage-RunManually.ps1" target="content\PostBuildScripts\UploadPackage-RunManually.ps1" />
    <file src="Content\UploadPackage-RunManually.bat" target="content\PostBuildScripts\UploadPackage-RunManually.bat" />
    <file src="tools\Install.ps1" target="tools\Install.ps1" />
    <file src="tools\Uninstall.ps1" target="tools\Uninstall.ps1" />
  </files>
</package>

Si vous ne voulez pas forcer vos utilisateurs à avoir au moins NuGet v2.8 installé avant de pouvoir utiliser votre package, alors vous pouvez tilisez la solution que j'ai trouvée et bloguée avant NuGet 2.8 L'attribut developmentDependency existait.

27
deadlydog

Si vous utilisez l'élément PackageReference au lieu de package.config fichier, voici la solution:

<PackageReference Include="Nerdbank.GitVersioning" Version="1.5.28-rc" PrivateAssets="All" />

ou

<PackageReference Include="Nerdbank.GitVersioning" Version="1.5.28-rc">
   <PrivateAssets>all</PrivateAssets>
</PackageReference>

Discussion GitHub associée

9
Philippe

Vous pouvez spécifier explicitement les fichiers à inclure, puis exécuter la commande pack sur le fichier nuspec lui-même.

<?xml version="1.0"?>
<package >
  <metadata>
    <id>MyProject</id>
    <version>1.2.3</version>
    <title>MyProject</title>
    <authors>Example</authors>
    <owners>Example</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Example</description>
    <copyright>Copyright 2013 Example</copyright>
    <tags>example</tags>
    <dependencies />
  </metadata>

  <files>
    <file src="bin\Release\MyProject.dll" target="lib" />
  </files>

</package>

Vous devez définir l'attribut src avec le chemin d'accès relatif au fichier nuspec ici. Ensuite, vous pouvez exécuter la commande pack.

nuget.exe pack MyProject\MyProject.nuspec
3
Ufuk Hacıoğulları

Selon le numéro # 1956 ( https://nuget.codeplex.com/workitem/1956 ) et tirez la demande 3998 ( https://nuget.codeplex.com/SourceControl/network/ forks/adamralph/nuget/contribution/3998 ) cette fonctionnalité a été incluse dans le Version 2.4 Version 2.7.

Cependant, je ne parviens pas à trouver de documentation sur la fonctionnalité, et je ne sais toujours pas comment l'utiliser. Veuillez mettre à jour cette réponse si quelqu'un le sait.

Mise à jour: le numéro # 1956 a été mis à jour par le développeur. La fonctionnalité n'était pas incluse dans la version 2.4, mais a été reportée à la prochaine version 2.7. C'est pourquoi ce n'est pas encore documenté.

Je ne sais pas pourquoi vous voudriez ignorer les dépendances que votre package NuGet nécessite pour fonctionner, mais avez-vous pensé à utiliser plutôt l'outil NuGet Package Explorer pour créer votre package?

0
devdigital