Запрет на добавление 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, который будет использоваться вместо.

Включить восстановление пакета NuGet

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

Другие вопросы по тегам