Ce projet fait référence aux packages NuGet manquants sur cet ordinateur

313

J'ai une application ASP.NET MVC5 qui a fonctionné hier et maintenant j'obtiens cette erreur quand j'essaye de construire:

Ce projet fait référence aux packages NuGet manquants sur cet ordinateur.

J'ai les deux options vérifiées qui permettent à nuget de télécharger et d'installer automatiquement les packages manquants cochés / activés. J'ai également essayé de supprimer tous les fichiers du dossier des packages, puis de les télécharger à nouveau. De plus, lorsque j'ouvre nuget et cherche des mises à jour, il est dit qu'il n'y en a pas à installer. Je ne sais pas quoi faire d'autre pour aller au-delà de ce problème incroyablement ennuyeux.

Austin Harris
la source
1
J'ai également activé la restauration de pépites en cliquant avec le bouton droit sur le projet et en sélectionnant cette option. Il a ensuite ajouté un dossier nuget et trois éléments dans ce dossier et ne fait rien pour résoudre le problème. J'ai essayé de reconstruire et j'obtiens toujours la même erreur ci-dessus.
Austin Harris
Votre solution comprend-elle un dossier .nuget et avez-vous mis à jour NuGet vers la dernière version? Voir ici: stackoverflow.com/questions/18833649/…
David Brabant
Oui, j'ai essayé et cela n'a pas résolu mon problème de message d'erreur de génération.
Austin Harris
Une autre raison de cette erreur est une The operation has timed out.erreur. pendant la construction. Vous devez vérifier votre journal de génération ou l' onglet Diagnostics dans l'écran d'informations de Visual Studio Online Build Failed.
Joshua Drake du
Aucune des solutions ne fonctionne pour moi. Je télécharge à partir d'un dépôt et les packages sont restaurés dans la structure de fichiers correcte pour le premier projet, le deuxième projet ne les trouve pas. La vérification du fichier .csproj montre que le chemin relatif correct est utilisé, donc je ne peux pas essayer de résoudre ce problème. github.com/DanJ210/ProgrammersTest
Daniel Jackson

Réponses:

463

Dans mon cas, j'ai dû supprimer les éléments suivants du fichier .csproj:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

En fait, dans cet extrait, vous pouvez voir d'où vient le message d'erreur.

Je convertissait de MSBuild-Ensemble intégré de restauration à forfait restauration automatique ( http://docs.nuget.org/docs/workflows/migrating-to-automatic-package-restore )

Loren Paulsen
la source
12
Cela a fonctionné pour moi, mais je n'avais besoin que de supprimer l'élément <Target> </Target>. VS [2013] semblait le restaurer si je supprimais également l'élément <Import>.
Robert Taylor
3
C'est vraiment incroyable. Pourquoi Microsoft rend-il tout si difficile?
dimiguel
11
si cela peut être supprimé, pourquoi est-il là en premier lieu?
OK999
1
OK9999, à un moment donné, vous devez l'avoir activé à partir d'une version antérieure de Visual Studio, en cliquant avec le bouton droit sur la solution et en choisissant "Activer la restauration du package NuGet", ce qui était le cas à l'ancienne. Nous n'en avons plus besoin
Loren Paulsen
3
J'adore les solutions qui consistent uniquement à supprimer des choses.
Todd Menier du
86

Une solution consisterait à supprimer du fichier .csproj les éléments suivants:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
  <PropertyGroup>
    <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
  </PropertyGroup>
  <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Comment?

  1. Faites un clic droit sur le projet. Décharger le projet.
  2. Faites un clic droit sur le projet. Modifiez csproj.
  3. Retirez la pièce du fichier. Sauver.
  4. Faites un clic droit sur le projet. Recharger le projet.
Ivan Santiago
la source
Lorsque vous déplacez un projet d'un endroit à un autre, cela fonctionne très bien.
Dean Seo
4
@IvanSantiago C'était déjà RÉPONDU ci-dessus avec la même solution! .. Votez BAS! ..
Jack
2
@ClintEastwood Ma réponse a expliqué COMMENT le faire. Voilà la différence. Si un utilisateur recherche un COMMENT FAIRE, ma réponse l'a, contrairement à la réponse ci-dessus.
Ivan Santiago
2
@IvanSantiago Vous auriez pu: l'ajouter en tant que commentaire ou modifier la réponse originale avec le How To.
Colin
50

Dans mon cas, cela s'est produit après avoir déplacé mon dossier de solution d'un emplacement à un autre, l'ai un peu réorganisé et, dans le processus, sa structure de dossiers relative a changé.

J'ai donc dû modifier toutes les entrées similaires à la suivante dans mon .csprojfichier à partir de

  <Import Project="..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

à

  <Import Project="packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />

(Notez le changement de ..\packages\à packages\. Il peut s'agir d'une structure relative différente dans votre cas, mais vous avez l'idée.)

Nikita G.
la source
3
Problème similaire .... J'avais déplacé le fichier .csproj d'un niveau dans la structure du répertoire et je devais passer de ".. \ .. \ packages \ ..." à ".. \ packages \ ...".
tmgirvin
2
J'ai eu un problème similaire, mais vraiment bizarre. Je l'utilisais dans un module de sous-résolution, donc c'était bien dans cette solution, mais quand j'ai référencé cette solution à partir d'une autre solution, les packages étaient à un endroit différent. J'ai changé les packages .. \ packages en packages $ (SolutionDir) dans le fichier .csproj et cela a été corrigé.
JoeNCA
2
Si vous ne voulez pas fouiner avec le fichier .csproj manuellement, j'ai constaté que prendre note de tous les packages de nuget que vous avez installés pour le projet, les supprimer et les réinstaller a résolu ce problème pour moi. J'essayais de supprimer un projet d'une solution pour le placer dans son propre référentiel git lorsque j'ai rencontré ce problème.
WiteCastle
cela signifie-t-il que votre .csproj est au même niveau que votre fichier .sln?
Simon_Weaver
@Simon_Weaver la position de votre par .csprojrapport à votre .slnn'a pas d'importance dans ce contexte. Ce qui importe, c'est de savoir si tout ce qui est référencé dans votre document .csproja déménagé ailleurs. Si c'est le cas, vous devez le réparer. Si vous avez déplacé votre '.csproj' avec tout ce qu'il fait référence, mais que vous avez conservé votre .slnemplacement, vous devez alors corriger le .slnfichier au nouvel emplacement de .csproj-es, mais il ne sera pas nécessaire de modifier les .csprojfichiers.
Nikita G.15
22

Je résous facilement ce problème en cliquant avec le bouton droit sur ma solution, puis en cliquant sur Activer la restauration du package NuGet l' option

(PS: assurez-vous que Nuget Install From Tools -> Extensions and Update -> Nuget Package Manager for Visual Studio 2013. Sinon, installez d'abord cette extension)

J'espère que ça aide.

MA
la source
7
Il s'agit de l'ancienne méthode de restauration des packages de pépites et doit être évitée.
The Muffin Man
2
@TheMuffinMan: Pouvez-vous préciser quelle est la nouvelle méthode et pourquoi cette méthode doit être évitée (étant donné que la sortie d'erreur VS 2013 vous dit de faire exactement cela)?
CantrianBear
2
@CantrianBear Accédez à cette page docs.nuget.org/consume/package-restore et recherchez la section intitulée MSBuild-Integrated Package Restore. C'est l'ancienne méthode et elle énumère quelques raisons pour lesquelles vous devriez utiliser la nouvelle méthode.
The Muffin Man
Voir le blog de David Ebbo sur ce blog.davidebbo.com/2014/01/… Maintenant ... "NuGet restaure toujours les packages avant de construire dans VS."
timB33
17

Dans mon cas, cela avait à voir avec la version Microsoft.Build.Bcl. La version de mon nuget était 1.0.21, mais mes fichiers de projet pointaient toujours vers la version 1.0.14

J'ai donc changé mes fichiers .csproj de:

  <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" />
   <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.14\tools\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />
  </Target>

à:

 <Import Project="..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets" Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" />
  <Target Name="EnsureBclBuildImported" BeforeTargets="BeforeBuild" Condition="'$(BclBuildImported)' == ''">
    <Error Condition="!Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=317567." HelpKeyword="BCLBUILD2001" />
    <Error Condition="Exists('..\..\packages\Microsoft.Bcl.Build.1.0.21\build\Microsoft.Bcl.Build.targets')" Text="The build restored NuGet packages. Build the project again to include these packages in the build. For more information, see http://go.microsoft.com/fwlink/?LinkID=317568." HelpKeyword="BCLBUILD2002" />

Et la version fonctionnait à nouveau.

henkie14
la source
11

Si vous utilisez TFS

Supprimez les fichiers NuGet.exeet du NuGet.targetsdossier de la solution .nuget. Assurez-vous que les fichiers eux-mêmes sont également supprimés de l'espace de travail de la solution. Conservez le NuGet.Configfichier pour continuer à contourner l'ajout de packages au contrôle de code source.

Modifiez chaque fichier de projet (par exemple, .csproj, .vbproj) dans la solution et supprimez toutes les références au NuGet.targetsfichier. Ouvrez le ou les fichiers de projet dans l'éditeur de votre choix et supprimez les paramètres suivants:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Si vous n'utilisez pas TFS

Supprimez le .nugetdossier de votre solution. Assurez-vous que le dossier lui-même est également supprimé de l'espace de travail de la solution.

Modifiez chaque fichier de projet (par exemple, .csproj, .vbproj) dans la solution et supprimez toutes les références au NuGet.targetsfichier. Ouvrez le ou les fichiers de projet dans l'éditeur de votre choix et supprimez les paramètres suivants:

<RestorePackages>true</RestorePackages>  
...
<Import Project="$(SolutionDir)\.nuget\nuget.targets" />  
...
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">  
    <PropertyGroup>
        <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>

Référence: Migration de solutions intégrées à MSBuild pour utiliser la restauration automatique de packages

RAM
la source
8

Est-il possible que les packages aient été restaurés dans le mauvais dossier? Vérifiez que les chemins d'accès dans les fichiers csproj sont corrects.

S'ils sont différents, cela peut être dû au fait que les packages sont maintenant restaurés vers un emplacement différent. Cela peut être dû à la vérification d'un fichier NuGet.Config en spécifiant un nœud comme celui-ci:

<add key="repositoryPath" value="..\..\Packages" />

Les paquets sont en cours de restauration, par les projets sont toujours à la recherche de l'ancien emplacement.

infojolt
la source
1
Je pense que cela pourrait être un problème de chemin puisque j'ai déplacé l'emplacement des fichiers mais je ne vois pas où il y a un chemin codé en dur n'importe où. J'ai regardé dans le fichier proj et tous les fichiers de packages semblent être relatifs comme ceci: <Reference Include = "Antlr3.Runtime, Version = 3.5.0.2, Culture = neutral, PublicKeyToken = eb42632606e9261f, processorArchitecture = MSIL"> <SpecificVersion> False </SpecificVersion> <HintPath> .. \ packages \ Antlr.3.5.0.2 \ lib \ Antlr3.Runtime.dll </HintPath> </Reference>
Austin Harris
l'ajout de cela à web.config n'a pas aidé: <add key = "repositoryPath" value = ".. \ .. \ Packages" />
Austin Harris
Vous ne voulez pas ajouter cela au web.config. Je faisais référence au fichier NuGet.config et vous voulez vérifier le chemin relatif. Où sont vos packages par rapport aux fichiers csproj? Sont-ils dans .. \ packages? Il semble que les packages soient correctement restaurés, mais vos projets ne sont pas au bon endroit.
infojolt
6

J'ai eu le même problème. Dans mon cas, l'installation du package Microsoft.Bcl.Build a résolu le problème.

mheyman
la source
Cela a également fonctionné pour moi - mais je ne sais pas si la bonne chose à faire était d'installer ce package (qui a le même effet que la réponse de changement de version de henkie14 ci-dessous ou simplement de supprimer toutes ces cibles - font-elles réellement quelque chose d'utile?
Gaz
Dans la 1.0.21version aucun fichier dans le package, l'installation de la 1.0.14version a corrigé ce problème.
FLCL
4

Suppression des lignes ci-dessous dans le fichier .csproj

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" 
Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
<PropertyGroup>
 <ErrorText>This project references NuGet package(s) that are missing on this computer. 
 Enable NuGet Package Restore to download them.  For more information, see 
 http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
</PropertyGroup>
<Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" 
Text="$([System.String]::Format('$(ErrorText)', 
'$(SolutionDir)\.nuget\NuGet.targets'))" />
</Target>
Amila Thennakoon
la source
3

Une solution consisterait à supprimer du fichier .csproj les éléments suivants:

<Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />

Ce projet fait référence aux packages NuGet manquants sur cet ordinateur. Activez NuGet Package Restore pour les télécharger. Pour plus d'informations, voir http://go.microsoft.com/fwlink/?LinkID=322105 . Le fichier manquant est {0}.

Umar Khaliq
la source
1

Voici les étapes que j'ai utilisées pour résoudre le problème:

Pour ajouter des packages nuget à votre solution:

  1. Cliquez avec le bouton droit sur le projet (pas la solution) que vous souhaitez référencer les packages de nuget.
  2. Choisissez: Gérer les packages nuget
  3. Dans la fenêtre contextuelle, à gauche, vous avez trois choix. Si vous choisissez En ligne> Microsoft et .NET , vous pourrez installer le groupeur de packages Microsoft ASP.NET Web API 2.2 (ou le package dont vous avez besoin - le mien était celui-ci).
  4. Maintenant, faites un clic droit sur votre solution (pas sur le projet) et choisissez Activer la restauration du package nuget . Cela entraînera le téléchargement automatique des packages lors de la compilation.
user4569838
la source
Tout ce que j'avais à faire était d'activer la restauration des packages de nuggets pour la solution. Apparemment, tout le reste était déjà correctement configuré.
schmiddy98
1

Pour moi, cela a fonctionné car je viens de copier un dossier .nuget d'une solution de travail vers la solution existante et de référencer son contenu!

meJustAndrew
la source
1

La première chose à essayer est de cliquer avec le bouton droit sur la solution et de sélectionner "Restaurer les packages Nuget".

Dans mon cas, cela n'a pas fonctionné, j'ai donc suivi quelques recommandations sur la suppression de "Import" et "Target" dans le fichier de projet, cela a fonctionné pour 2 de mes 3 projets, mais j'ai obtenu une erreur différente sur le dernier.

Ce qui a fonctionné était d'ouvrir la console du gestionnaire de packages et d'exécuter:

Update-Package -reinstall -ProjectName MyProjectName

Cela prend un certain temps, mais comme il réinstalle tous les packages, votre projet se compilera sans problème

Juan C Calderon
la source
1

J'ai le même problème. Je l'ai rencontré lorsque j'ai copié un projet existant et l'ai transféré sur le dossier de mon répertoire de solution et l'ai ajouté en tant que projet existant à ma solution vide. Je dois donc modifier mon fichier csproj et rechercher cette ligne de code spécifique, la plupart du temps, elle se trouve sur les dernières lignes:

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

Après cette ligne, je dois commenter ces derniers:

  <Import Project="$(SolutionDir)\.nuget\NuGet.targets" Condition="Exists('$(SolutionDir)\.nuget\NuGet.targets')" />
  <Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Use NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.props'))" />
    <Error Condition="!Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets'))" />
  </Target>
  <Import Project="..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets" Condition="Exists('..\..\..\..\..\packages\EntityFramework.6.4.0\build\EntityFramework.targets')" />

Votre solution vous demandera s'il y a eu un changement sur votre projet, sélectionnez simplement Recharger tout:

entrez la description de l'image ici Ensuite, tout fonctionne bien après avoir reconstruit ma solution.

Willy David Jr
la source
0

J'ai eu le même problème lorsque je référence la bibliothèque de classes dans mon application Web MVC,

le problème était la non-concordance du numéro de version du package nuget entre deux projets.

ex: ma bibliothèque de classe avait log4net de 1.2.3 mais ma webapp avait 1.2.6

correction: assurez-vous simplement que le projet a le même numéro de version référencé.

Srini
la source
0

La modification de .sln et .csproj n'est pas toujours aussi simple ou souhaitable. Une fois que vous obtenez la liste d'erreurs, vous pouvez voir quels projets ont des packages manquants (également, le nœud Références indique généralement qu'il manque des assemblys, sauf si les packages sont du code source, des ressources, des images ou simplement du texte).

La suppression puis l'ajout des packages n'est pas une bonne idée, sauf si vous utilisez la dernière version du package. Sinon préparez-vous à des surprises, pas toujours agréables.

Si, par exemple, le package est EntityFramework, la galerie NuGet vous donne la dernière version qui, au moment de la rédaction de ce commentaire, est 6.1.3 .

Donc, peut-être que le moyen le plus sûr de gérer la situation est de restaurer les packages manquants un par un. Oui, un exercice un peu pénible, mais chasser les bogues subtils en raison de la version différente du package peut-être beaucoup plus désagréable.

Cela dit, et laissez EntityFramework être le package manquant, vous pouvez exécuter la commande suivante dans la console du gestionnaire de packages:

PM> Install-Package EntityFramework -Version 6.0.1 

Cela installera la version correcte, c'est-à-dire 6.0.1 , qui est celle qui est spécifiée dans packages.config:

    <?xml version="1.0" encoding="utf-8"?>
    <packages>
      <package id="EntityFramework" version="6.0.1" targetFramework="net451" />
    </packages>
Alexander Christov
la source
0

J'ai eu cela quand les fichiers csproj et sln étaient dans le même dossier (stupide, je sais). Une fois que je suis passé au fichier sln dans le dossier au-dessus du dossier csproj mon so

David Christopher Reynolds
la source
-1

J'ai créé un dossier nommé '.nuget' dans le dossier racine de la solution, puis ajouté le fichier 'NuGet.Config' dans ce dossier avec le contenu suivant

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<solution>
 <add key="disableSourceControlIntegration" value="true" />
</solution>
</configuration>

Puis créé le fichier '.nuGet.targets' comme ci-dessous $ (MSBuildProjectDirectory) .. \

    <!-- Enable the restore command to run before builds -->
    <RestorePackages Condition="  '$(RestorePackages)' == '' ">false</RestorePackages>

    <!-- Property that enables building a package from a project -->
    <BuildPackage Condition=" '$(BuildPackage)' == '' ">false</BuildPackage>

    <!-- Determines if package restore consent is required to restore packages -->
    <RequireRestoreConsent Condition=" '$(RequireRestoreConsent)' != 'false' ">true</RequireRestoreConsent>

    <!-- Download NuGet.exe if it does not already exist -->
    <DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
</PropertyGroup>

<ItemGroup Condition=" '$(PackageSources)' == '' ">
    <!-- Package sources used to restore packages. By default will used the registered sources under %APPDATA%\NuGet\NuGet.Config -->
    <!--
        <PackageSource Include="https://nuget.org/api/v2/" />
        <PackageSource Include="https://my-nuget-source/nuget/" />
    -->
</ItemGroup>

<PropertyGroup Condition=" '$(OS)' == 'Windows_NT'">
    <!-- Windows specific commands -->
    <NuGetToolsPath>$([System.IO.Path]::Combine($(SolutionDir), ".nuget"))</NuGetToolsPath>
    <PackagesConfig>$([System.IO.Path]::Combine($(ProjectDir), "packages.config"))</PackagesConfig>
    <PackagesDir>$([System.IO.Path]::Combine($(SolutionDir), "packages"))</PackagesDir>
</PropertyGroup>

<PropertyGroup Condition=" '$(OS)' != 'Windows_NT'">
    <!-- We need to launch nuget.exe with the mono command if we're not on windows -->
    <NuGetToolsPath>$(SolutionDir).nuget</NuGetToolsPath>
    <PackagesConfig>packages.config</PackagesConfig>
    <PackagesDir>$(SolutionDir)packages</PackagesDir>
</PropertyGroup>

<PropertyGroup>
    <!-- NuGet command -->
    <NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>
    <PackageSources Condition=" $(PackageSources) == '' ">@(PackageSource)</PackageSources>

    <NuGetCommand Condition=" '$(OS)' == 'Windows_NT'">"$(NuGetExePath)"</NuGetCommand>
    <NuGetCommand Condition=" '$(OS)' != 'Windows_NT' ">mono --runtime=v4.0.30319 $(NuGetExePath)</NuGetCommand>

    <PackageOutputDir Condition="$(PackageOutputDir) == ''">$(TargetDir.Trim('\\'))</PackageOutputDir>

    <RequireConsentSwitch Condition=" $(RequireRestoreConsent) == 'true' ">-RequireConsent</RequireConsentSwitch>
    <!-- Commands -->
    <RestoreCommand>$(NuGetCommand) install "$(PackagesConfig)" -source "$(PackageSources)"  $(RequireConsentSwitch) -o "$(PackagesDir)"</RestoreCommand>
    <BuildCommand>$(NuGetCommand) pack "$(ProjectPath)" -p Configuration=$(Configuration) -o "$(PackageOutputDir)" -symbols</BuildCommand>

    <!-- Make the build depend on restore packages -->
    <BuildDependsOn Condition="$(RestorePackages) == 'true'">
        RestorePackages;
        $(BuildDependsOn);
    </BuildDependsOn>

    <!-- Make the build depend on restore packages -->
    <BuildDependsOn Condition="$(BuildPackage) == 'true'">
        $(BuildDependsOn);
        BuildPackage;
    </BuildDependsOn>
</PropertyGroup>

<Target Name="CheckPrerequisites">
    <!-- Raise an error if we're unable to locate nuget.exe  -->
    <Error Condition="'$(DownloadNuGetExe)' != 'true' AND !Exists('$(NuGetExePath)')" Text="Unable to locate '$(NuGetExePath)'" />
    <SetEnvironmentVariable EnvKey="VisualStudioVersion" EnvValue="$(VisualStudioVersion)" Condition=" '$(VisualStudioVersion)' != '' AND '$(OS)' == 'Windows_NT' " />
    <DownloadNuGet OutputFilename="$(NuGetExePath)" Condition=" '$(DownloadNuGetExe)' == 'true' AND !Exists('$(NuGetExePath)')"  />
</Target>

<Target Name="RestorePackages" DependsOnTargets="CheckPrerequisites">
    <Exec Command="$(RestoreCommand)"
          Condition="'$(OS)' != 'Windows_NT' And Exists('$(PackagesConfig)')" />

    <Exec Command="$(RestoreCommand)"
          LogStandardErrorAsError="true"
          Condition="'$(OS)' == 'Windows_NT' And Exists('$(PackagesConfig)')" />
</Target>

<Target Name="BuildPackage" DependsOnTargets="CheckPrerequisites">
    <Exec Command="$(BuildCommand)" 
          Condition=" '$(OS)' != 'Windows_NT' " />

    <Exec Command="$(BuildCommand)"
          LogStandardErrorAsError="true"
          Condition=" '$(OS)' == 'Windows_NT' " />
</Target>

<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <OutputFilename ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Reference Include="System.Core" />
        <Using Namespace="System" />
        <Using Namespace="System.IO" />
        <Using Namespace="System.Net" />
        <Using Namespace="Microsoft.Build.Framework" />
        <Using Namespace="Microsoft.Build.Utilities" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
            try {
                OutputFilename = Path.GetFullPath(OutputFilename);

                Log.LogMessage("Downloading latest version of NuGet.exe...");
                WebClient webClient = new WebClient();
                webClient.DownloadFile("https://nuget.org/nuget.exe", OutputFilename);

                return true;
            }
            catch (Exception ex) {
                Log.LogErrorFromException(ex);
                return false;
            }
        ]]>
        </Code>
    </Task>
</UsingTask>

 <UsingTask TaskName="SetEnvironmentVariable" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <ParameterGroup>
        <EnvKey ParameterType="System.String" Required="true" />
        <EnvValue ParameterType="System.String" Required="true" />
    </ParameterGroup>
    <Task>
        <Using Namespace="System" />
        <Code Type="Fragment" Language="cs">
            <![CDATA[
            try {
                Environment.SetEnvironmentVariable(EnvKey, EnvValue, System.EnvironmentVariableTarget.Process);
            }
            catch  {
            }
        ]]>
        </Code>
    </Task>
</UsingTask>

Sofia Khwaja
la source