web-dev-qa-db-fra.com

NuGet ajouter une référence externe

J'ai un fichier .nuspec pour mon projet, qui fait référence à un tiers DLL que le projet, y compris mon package, doit référencer.

<?xml version="1.0"?>
<package >
<metadata>
<id>$id$</id>
<version>$version$</version>
<title>$title$</title>
<authors>$author$</authors>
<owners>$author$</owners>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>$description$</description>
<releaseNotes>Locked against log4net 1.2 - less than 1.2.11 which has breaking changes</releaseNotes>
<copyright>Copyright 2012  blah blah</copyright>
<dependencies>
  <dependency id="log4net" version="[1.2,1.2.11)" />
  <dependency id="My.Other.Project" />
</dependencies>
<references>
  <reference file="Third.Party.dll" />
</references>

Si j'essaie d'exécuter le pack nuget.exe My.Project.csproj à partir du répertoire avec le fichier .csproj et le fichier .nuspec, j'obtiens

Référence d'assembly non valide 'Third.Party.dll'. Assurez-vous qu'un fichier nommé "Third.Party.dll" existe dans le répertoire lib.

J'ai créé.\Lib.\Bin\Debug\lib.\Obj\lib

et le fichier se trouve aux trois endroits. Où veut-il vraiment le dossier lib?

36
Carl Bussema

L'élément < references > définit les références qui seront ajoutées au projet lors de l'installation de votre package. Ce qui vous manque, c'est la partie qui définit les fichiers qui font partie de votre package qui se fait avec l'élément < files >. Votre fichier .nuspec devrait donc ressembler à ceci:

<?xml version="1.0"?>
<package>
    <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>$author$</authors>
    <owners>$author$</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>$description$</description>
    <releaseNotes>Locked against log4net 1.2 - less than 1.2.11 which has breaking changes</releaseNotes>
    <copyright>Copyright 2012  blah blah</copyright>
    <dependencies>
      <dependency id="log4net" version="[1.2,1.2.11)" />
      <dependency id="My.Other.Project" />
    </dependencies>
    <references>
      <reference file="Third.Party.dll" />
    </references>
  </metadata>
  <files>
    <file src="lib\Third.Party.dll" target="lib"/>
  </files>
</package>

La seule différence est l'élément files après l'élément metadata.

37
Matt Ward

J'ai eu le même problème et voici comment je l'ai résolu. Cela me semblait étrange, mais il semble que cela fonctionne et je n'ai pas besoin de créer un paquet de pépites pour mon assemblage tiers de cette façon.

Mon .nuspec ressemble à ceci:

 <?xml version="1.0"?>
<package >
    <metadata>
        <id>$id$</id>
        <version>$version$</version>
        <title>$title$</title>
        <authors>$author$</authors>
        <owners>$author$</owners>
        <requireLicenseAcceptance>false</requireLicenseAcceptance>
        <description>$description$</description>
        <releaseNotes>Some release notes</releaseNotes>
        <copyright>Copyright 2012</copyright>
        <tags>some,tags</tags>
        <references>
            <reference file="thirdparty.dll"></reference>
            <reference file="ThisAssemblyName.dll"></reference>
        </references>
    </metadata>
    <files>
        <file src="web.config.transform" target="content"/>
        <file src="lib\net40\thirdparty.dll" target="lib\net40"/>
    </files>
</package>

Comme vous pouvez le voir - j'ai dû ajouter un nœud de fichier pour copier ma DLL tierce dans le dossier lib\net40 cible (dans mon cas). Ensuite, j'ai dû ajouter des nœuds de "référence" à la fois pour le fichier thirdparty.dll ainsi que pour l'assembly que ce package NuGet était en train de créer. Je pense que la solution de Matt Ward devrait être correcte, mais cela ne fonctionnait pas pour moi jusqu'à ce que j'ajoute le nœud de référence (redondant).

J'espère que ça aide!

Merci

Mustafa

12
Mustafakidd