Verhindern Sie, dass NuGet.exe zur Quellcodeverwaltung hinzugefügt werden muss

73

Einige Zusammenhänge:
Ich habe das Tutorial zur Verwendung von NuGet befolgt , ohne Pakete mit einigem Erfolg festzuschreiben . Nachdem Sie dieses NuGet-Problem durch manuelles Hinzufügen <RestorePackages>und <Import ...>für die Datei nuget.targets umgangen hatten, funktionierten die Dinge.

Nachdem ich das Repository mit Mercurial geklont habe, wurde beim Erstellen der folgende Fehler angezeigt:

'C: \ ... \ Visual Studio 2010 \ Projects \ MyProject \ .nuget \ nuget.exe' konnte nicht gefunden werden.

Dies ist sinnvoll, da ich aufgrund meines Ignoriermusters die exe-Datei nicht einchecken konnte. Aus dieser verwandten SO-Frage folgerte ich, dass es nicht ungewöhnlich ist, diese Datei in der Versionskontrolle zu haben (oder?), Aber ich würde es wirklich vorziehen, NuGet.exe nicht zur Versionskontrolle zu verpflichten, wenn ich helfen kann.


Frage: Gibt es eine bequeme Möglichkeit, das Einchecken in NuGet.exe zu verhindern?


Ich habe Google-Fu ausprobiert, die Dokumentation überflogen und mit der Datei NuGet.targets herumgespielt, bisher kein Glück. Es scheint vorzuziehen, wenn ich nur dynamisch auf die NuGet.exe der bestimmten Umgebung verweisen könnte, in der die Lösung erstellt wird.

Ich weiß, dass ich einfach die exe-Datei hinzufügen könnte, aber ich würde lieber wissen, ob es andere Möglichkeiten gibt, damit umzugehen, oder warum es keine praktikablen Alternativen gibt.

Update:
Die Datei nuget.targets enthält einige relevante XML-Dateien:

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

Ich bin mit der Funktionsweise von .targets-Dateien nicht vertraut, aber dies scheint in etwa dem zu entsprechen, wonach ich suche. Mit meinem Cowboy-Codierung auf I Hut versucht , das zu ändern , falseum truein dem DownloadNuGetExe Elemente, aber das hat nicht wie erwartet (mit oder ohne die Bedingung Attribut).

Jeroen
quelle
Sie können auch den Ordner .nuget löschen und die Projektdatei bearbeiten. Danach können Sie die App starten.
DmitryBoyko

Antworten:

122

Gerade überprüft: nuget.targets ist eine msbuild-Datei. Und Sie waren auf dem richtigen Weg, in:

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

Ändern Sie den Wert in true:

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

Sie müssen Visual Studio jedoch neu starten oder die Lösung neu laden (siehe Kommentare) , damit sie wirksam wird.

Pavel Bakshy
quelle
3
Oh mein Gott. Ich kann nicht glauben, dass die Lösung darin bestand, VS neu zu starten! (Warum ist das überhaupt so?) Vielen Dank!
Jeroen
Kein Problem. Es sieht nach einem Fehler aus, dass VS keine Änderungen in Dateien verfolgt, die mit csproj-Dateien verknüpft sind, und nicht nach einem erneuten Laden fragt.
Pavel Bakshy
7
Sie müssen VS nicht neu starten. Laden Sie einfach die Lösung neu, damit die Projekte erneut gelesen werden.
anton.burger
@ Shambulator Danke für den Tipp, ich habe die Antwort aktualisiert, damit zukünftige Besucher diese Lösung leicht erkennen können
Jeroen
2
Visual Studio verwendet ein extrem aggressives Cacheing von Lösungs- und Projektdateien (und auch / insbesondere von msbuild-Projektdateien, die über den Import geladen wurden). Wenn Sie msbuild-Dateien ändern, können Sie sie sofort über die Befehlszeile testen und anschließend die entsprechenden Projekte erneut laden VS:
Sebastian PR Gingter
12

Wenn Sie sich diese .targetsDatei ansehen, gibt es eine andere Möglichkeit, dies zu tun, wenn Sie weder einchecken NuGet.exenoch jedes Mal herunterladen möchten . Die Schlüsselzeile lautet:

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

Gemäß der MSBuild-Konvention, Eigenschaften nur festzulegen, wenn sie noch nicht definiert wurden, wird standardmäßig die lokale Kopie der Lösung verwendet NuGet.exe, die heruntergeladen wird, wenn die DownloadNuGetExeEigenschaft vorhanden ist true. MSBuild-Eigenschaften können jedoch von Umgebungsvariablen überschrieben werden.

Wenn Sie bereits NuGet zu einem zentralen Standort heruntergeladen haben , können Sie verlassen DownloadNuGetExeauf falseund eine Umgebungsvariable definieren aufgerufen NUGETEXEPATH, die stattdessen verwendet werden.

anton.burger
quelle
0

Aktivieren Sie die NuGet-Paketwiederherstellung Geben Sie hier die Bildbeschreibung ein

Klicken Sie mit der rechten Maustaste auf die Lösung und wählen Sie NuGet Package Restore aktivieren

Mohammad Farahani
quelle
1
Das beantwortet meine Frage nicht wirklich, oder? Im ersten Artikel erwähne ich, dass genau diese Anweisung ebenfalls enthalten ist, dh bei meiner Frage können Sie davon ausgehen, dass ich die Paketwiederherstellung bereits aktiviert habe. Meine Frage ist zu bekommen, nuget.exewenn es fehlt.
Jeroen
Ja Entschuldigung!. Ich denke, Sie müssen NuGet-Paket für Ihre Lösung hinzufügen
Mohammad Farahani