Предотвратите необходимость добавления NuGet.exe в исходное управление

Некоторый контекст:
Я последовал за учебником по использованию NuGet без каких-либо пакетов с некоторым успехом. После обхода этой проблемы NuGet, вручную добавив <RestorePackages> и <Import ...> для файла nuget.targets, которые работали.

Однако, как только я клонировал репозиторий с Mercurial, я получил следующую ошибку при создании:

Невозможно найти "C: \...\Visual Studio 2010\Projects\MyProject \.nuget\nuget.exe '

Это имеет смысл, потому что мой шаблон игнорирования помешал мне проверить файл exe. Из этого связанного вопроса SO я предположил, что это не редкость иметь этот файл в управлении версиями (или это?), Но на самом деле я бы предпочел не зафиксируйте NuGet.exe до контроля версий, если я могу помочь.


Вопрос: Есть ли удобный способ предотвратить необходимость в NuGet.exe?


Я пробовал Google-fu, просматривал документацию и возился с файлом NuGet.targets, пока не повезло. Кажется предпочтительным, если бы я мог просто динамически указывать на NuGet.exe конкретной среды, которая строила решение.

Я знаю, что могу просто добавить exe файл, но я бы предпочел узнать, есть ли другие способы справиться с этим или узнать, почему нет жизнеспособных альтернатив.

Update:
Файл nuget.targets содержит некоторый соответствующий xml:

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

Я не знаком с работой файлов .targets, но это похоже на то, что я ищу. С моей шляпой ковбойского кодирования я попытался изменить false на true в элементе DownloadNuGetExe, но это не сработало, как ожидалось (с атрибутом условия или без него).

Ответ 1

Только что проверено: nuget.targets - файл msbuild. И вы были на правильном пути, в:

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

Измените значение на true:

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

Но вы должны перезапустить Visual Studio или перезагрузить решение (см. комментарии) после этого, чтобы вступить в силу.

Ответ 2

Глядя на этот .targets файл, есть еще один способ сделать это, если вы не хотите проверять NuGet.exe внутри и не загружать его каждый раз. Ключевая строка такова:

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

Следуя соглашению MSBuild о настройке свойств, если они еще не определены, это значение по умолчанию соответствует локальной копии решения NuGet.exe, загружая его, если свойство DownloadNuGetExe равно true. Но свойства MSBuild могут быть переопределены переменными среды.

Если вы уже загрузили NuGet в какое-то центральное место, вы можете оставить DownloadNuGetExe в false и определить переменную среды с именем NUGETEXEPATH, которая будет использоваться вместо этого.

Ответ 3

Включить восстановление пакета NuGet введите описание изображения здесь

Щелкните правой кнопкой мыши на решении, затем выберите Включить восстановление пакета NuGet