Предотвратите необходимость добавления 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