74 votes

Éviter d'avoir à ajouter NuGet.exe au contrôle de source

Un peu de contexte :
J'ai suivi le tutoriel sur l'utilisation de NuGet sans commettre les paquets avec un certain succès. Après avoir travaillé autour ce problème NuGet en ajoutant manuellement <RestorePackages> et un <Import ...> pour le fichier nuget.targets, tout fonctionnait.

Cependant, une fois que j'ai cloné le référentiel avec Mercurial, j'ai obtenu l'erreur suivante lors de la construction :

Impossible de trouver ' C:\...\Visual Studio 2010 \Projects\MyProject\.nuget\nuget.exe '

C'est logique, car mon schéma d'ignorance m'empêchait de vérifier le fichier exe. De cette question relative au SO J'en ai déduit qu'il n'est pas rare d'avoir ce fichier dans le contrôle de version (ou est-ce le cas ?), mais en réalité j'aurais préférer ne pas commettre NuGet.exe au contrôle de version si je peux l'aider.


Pregunta: Existe-t-il un moyen pratique d'éviter d'avoir à vérifier dans NuGet.exe ?


J'ai essayé d'utiliser Google, de parcourir la documentation et de manipuler le fichier NuGet.targets, sans succès jusqu'à présent. Il me semble préférable de pouvoir pointer dynamiquement vers le fichier NuGet.exe de l'environnement particulier qui construit la solution.

Je sais que je pourrais simplement ajouter le fichier exe, mais je préférerais savoir s'il existe d'autres moyens de gérer cela ou savoir pourquoi il n'y a pas d'alternatives viables.

Mise à jour :
Le fichier nuget.targets contient quelques fichiers xml pertinents :

<!-- only (relevant) parts of the xml shown below -->
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
...
<UsingTask TaskName="DownloadNuGet" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
    <Task>
        <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>

Je ne suis pas familier avec le fonctionnement des fichiers .targets, mais cela semble correspondre à ce que je recherche. Avec mon chapeau de codage de cow-boy, j'ai essayé de modifier le fichier false a true dans l'élément DownloadNuGetExe, mais cela n'a pas fonctionné comme prévu (avec ou sans l'attribut condition).

0 votes

Vous pouvez également supprimer le dossier .nuget et modifier le fichier du projet, puis lancer l'application.

123voto

Pavel Bakshy Points 3954

Je viens de vérifier : nuget.targets est un fichier msbuild. Et vous étiez sur la bonne voie, dans :

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>

Changez la valeur en true :

<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>

Mais vous devez redémarrer Visual Studio ou recharger la solution (voir commentaires) après cela pour prendre effet.

3 votes

Oh mon Dieu. Je ne peux pas croire que la solution était de redémarrer VS ! (Pourquoi ça, d'ailleurs ?) Merci beaucoup !

0 votes

Pas de problème. Il semble que VS ne suive pas les changements dans les fichiers qui sont liés à des fichiers csproj et qui ne demandent pas de rechargement.

7 votes

Vous n'avez pas besoin de redémarrer VS, il suffit de recharger la solution pour que les projets soient relus.

12voto

shambulator Points 3765

En regardant ça .targets il existe un autre moyen de le faire si vous ne voulez ni vérifier NuGet.exe dans, ni le télécharger à chaque fois. L'essentiel est le suivant :

<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>

Suivant la convention de MSBuild de ne définir les propriétés que si elles n'ont pas déjà été définies, cette valeur est par défaut la copie locale de la solution de NuGet.exe en le téléchargeant si le DownloadNuGetExe la propriété est true . Mais les propriétés de MSBuild peuvent être remplacées par des variables d'environnement.

Si vous avez déjà téléchargé NuGet à un emplacement central, vous pouvez laisser DownloadNuGetExe sur false et définissez une variable d'environnement appelée NUGETEXEPATH qui sera utilisé à la place.

0voto

Mohammad Farahani Points 176

Activer la restauration des paquets NuGet enter image description here

Cliquez à droite sur la solution puis sélectionnez Activer la restauration des paquets NuGet

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X