Запрет на добавление NuGet.exe в систему контроля версий
Некоторый контекст:
Я следовал руководству по использованию NuGet без фиксации пакетов с некоторым успехом. После обхода этой проблемы NuGet, добавив вручную <RestorePackages>
и <Import ...>
для файла nuget.targets все работало.
Однако, как только я клонировал репозиторий с Mercurial, я получил следующую ошибку при сборке:
Не удалось найти 'C:\...\Visual Studio 2010\Projects\MyProject\.nuget\nuget.exe'
Это имеет смысл, потому что мой шаблон игнорирования не позволил мне проверить в исполняемый файл. Исходя из этого связанного с этим вопроса, я понял, что нередко иметь этот файл в системе управления версиями (или это так?), Но на самом деле я бы предпочел не передавать NuGet.exe в систему управления версиями, если я могу помочь.
Вопрос: Есть ли удобный способ предотвратить проверку в NuGet.exe?
Я попробовал Google-фу, просматривал документацию и возился с файлом NuGet.targets, но пока не повезло. Представляется предпочтительным, если бы я мог просто динамически указывать на NuGet.exe конкретной среды, которая создает решение.
Я знаю, что могу просто добавить exe-файл, но я бы предпочел узнать, есть ли другие способы справиться с этим или узнать, почему нет жизнеспособных альтернатив.
Обновить:
Файл 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, но это не сработало должным образом (с атрибутом условие или без него).
3 ответа
Только что проверил: nuget.targets - это файл msbuild. И вы были на правильном пути, в:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">false</DownloadNuGetExe>
Измените значение на true:
<DownloadNuGetExe Condition=" '$(DownloadNuGetExe)' == '' ">true</DownloadNuGetExe>
Но вы должны перезапустить Visual Studio или перезагрузить решение (см. Комментарии) после того, как это вступит в силу.
Глядя на это .targets
файл, есть другой способ сделать это, если вы тоже не хотите проверять NuGet.exe
в, ни скачать его каждый раз. Ключевая строка такова:
<NuGetExePath Condition=" '$(NuGetExePath)' == '' ">$(NuGetToolsPath)\nuget.exe</NuGetExePath>
В соответствии с соглашением MSBuild об установке только свойств, если они еще не определены, по умолчанию используется локальная копия решения. NuGet.exe
, загрузив его, если DownloadNuGetExe
свойство true
, Но свойства MSBuild могут быть переопределены переменными среды.
Если вы уже загрузили NuGet в какое-то центральное место, вы можете оставить DownloadNuGetExe
в false
и определить переменную среды под названием NUGETEXEPATH
, который будет использоваться вместо.