web-dev-qa-db-fra.com

Ne pas avoir besoin d'ajouter NuGet.exe au contrôle de code source

Un certain contexte:
J'ai suivi le tutoriel sur l'utilisation de NuGet sans valider les packages avec un certain succès. Après avoir contourné ce problème NuGet en ajoutant manuellement <RestorePackages> et un <Import ...> pour le fichier nuget.targets, les choses fonctionnaient.

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

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

Cela a du sens, car mon modèle d'ignorance m'a empêché d'archiver le fichier exe. De cette question SO question j'ai déduit qu'il n'est pas rare d'avoir ce fichier en contrôle de version (ou est-ce?), Mais vraiment je préfère ne pas valider NuGet.exe pour le contrôle de version si je peux l'aider.


Question: Existe-t-il un moyen pratique d'éviter d'avoir à archiver NuGet.exe?


J'ai essayé Google-fu, parcourant la documentation et tripoté le fichier NuGet.targets, pas de chance jusqu'à présent. Il semble préférable que je puisse simplement pointer dynamiquement vers 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 pourquoi il n'y a pas d'alternatives viables.

Mise à jour:
Le fichier nuget.targets contient du xml pertinent:

<!-- 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 connais pas le fonctionnement des fichiers .targets, mais cela semble aller dans le sens de ce que je recherche. Avec mon chapeau de codage cowboy, j'ai essayé de changer le false en true dans l'élément DownloadNuGetExe, mais cela n'a pas fonctionné comme prévu (avec ou sans l'attribut condition).

71
Jeroen

Juste vérifié: nuget.targets est un fichier msbuild. Et vous étiez sur la bonne voie, en:

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

Remplacez la valeur par 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.

120
Pavel Bakshy

En regardant ça .targets fichier, il existe un autre moyen de le faire si vous ne voulez pas non plus vérifier NuGet.exe in, ni le télécharger à chaque fois. La ligne clé est la suivante:

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

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

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

12
shambulator