ti-enxame.com

Não inclua dependências do arquivo packages.config ao criar o pacote NuGet

Estou usando o Nuget para criar pacotes. Gostaria de criar um pacote que não contenha nenhuma dependência (no arquivo .nuspec) Para outros pacotes do NuGet. Meu projeto possui dependências do pacote NuGet definidas em seu arquivo packages.config.

Primeiro, crio o arquivo .nuspec ...

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

Eu edito o arquivo .nuspec Gerado para ser mínimo, sem dependências.

<?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>

Então eu construo a solução e crio um pacote NuGet ...

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

Aqui está a saída desse comando ...

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'.

O pacote .nupkg Criado tem um arquivo .nuspec Contido nele, mas inclui uma seção de dependências que eu não tinha no arquivo original .nuspec ...

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

Eu acredito que isso está acontecendo por causa disso ... (da saída acima)

Found packages.config. Using packages listed as dependencies

Como posso fazer com que o NuGet não resolva automaticamente dependências e as insira no arquivo .nuspec Que é gerado a partir do comando pack?

Atualmente, estou usando o NuGet 2.2. Além disso, não acho que esse comportamento tenha ocorrido na versão mais antiga do NuGet; Este é um novo recurso"? Não encontrei nenhuma documentação descrevendo esse "recurso" ou quando ele foi implementado.

52
Jesse Webb

Na versão 2.7, há uma opção chamada developmentDependency que pode ser configurada em package.config para evitar a inclusão de dependência.

Excluindo dependências de desenvolvimento ao criar pacotes

<?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

Impedir que seu pacote seja dependente de outros pacotes

A partir de NuGet 2.7, existe um novo atributo developmentDependency que pode ser adicionado a um nó package no _ do seu projeto packages.config arquivo . Portanto, se o seu projeto incluir um pacote NuGet que você não deseja que o pacote NuGet inclua como dependência, use este atributo da seguinte maneira:

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

A parte importante que você precisa adicionar aqui é developmentDependency="true".

Impedir que seu pacote de desenvolvimento dependa de outros pacotes

Se você estiver criando um pacote NuGet de desenvolvimento para que outros consumam, que você sabe que eles não desejarão ter como dependência em seus pacotes, poderá evitar que os usuários tenham que adicionar manualmente esse atributo ao arquivo packages.config usando o - NuGet 2.8 developmentDependency atributo na seção de metadados do seu arquivo .nuspec . Isso adicionará automaticamente o atributo developmentDependency ao arquivo packages.config quando o seu pacote for instalado por outras pessoas. O problema aqui é que ele requer que o usuário tenha pelo menos o NuGet 2.8 instalado. Felizmente, podemos usar o atributo NuGet 2.5 minClientVersion para garantir que os usuários tenham pelo menos a v2.8 instalada; caso contrário, eles serão notificados de que precisam atualizar o cliente NuGet antes de instalar o pacote.

Eu tenho um pacote NuGet de desenvolvimento para o qual foi perfeito. Aqui está a aparência do meu arquivo .nuspec, mostrando como usar os atributos minClientVersion e developmentDependency (linhas 3 e 20, respectivamente):

<?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>

Se você não deseja forçar seus usuários a instalar pelo menos o NuGet v2.8 antes que eles possam usar o seu pacote, você pode sar a solução que eu vim e publiquei no blog antes do NuGet 2.8 O atributo developmentDependency existia.

27
deadlydog

Se você estiver usando o elemento PackageReference em vez de package.config _, aqui está a solução:

<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>

discussão relacionada ao GitHub

9
Philippe

Você pode especificar explicitamente quais arquivos incluir e executar o comando pack no próprio arquivo nuspec.

<?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>

Você deve definir o atributo src com o caminho que é relativo ao arquivo nuspec aqui. Então você pode executar o comando pack.

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

De acordo com a edição # 1956 ( https://nuget.codeplex.com/workitem/1956 ) e solicite pull 3998 ( https://nuget.codeplex.com/SourceControl/network/ bifurcações/adamralph/nuget/contribut/3998 ) esse recurso foi incluído no Versão 2.4 Versão 2.7.

No entanto, não consigo encontrar documentação sobre o recurso e ainda não entendi como usá-lo. Atualize esta resposta se alguém souber.

Atualização: o problema nº 1956 foi atualizado pelo desenvolvedor. O recurso não foi incluído na versão 2.4, mas foi adiado para a próxima versão 2.7. É por isso que ainda não está documentado.

3
Eivind Gussiås Løkseth

Não sei por que você deseja ignorar as dependências que o seu pacote NuGet exige para executar, mas você já pensou em usar a ferramenta NuGet Package Explorer para criar seu pacote?

0
devdigital