2012-04-15 5 views
3

Kann der Inhalt einer Datei, die über ein NuGet-Paket existiert, geändert werden? Nehmen wir an, Sie erstellen eine brandneue MVC3-Website. Sie möchten ein NuGet-Paket installieren, das die Startseite aktualisiert. Ändern Sie möglicherweise die Willkommensnachricht und ändern Sie dann das Layout so, dass einige neue Views, die Sie erstellt haben, enthalten sind, und aktualisieren Sie den Home Controller, um eine Methode zum Zurückgeben Ihrer neuen Ansicht hinzuzufügen. Wie würde das gemacht werden?Wie ändern Sie eine vorhandene Datei über eine NuGet-Paket-Installation?

Antwort

4

Nachdem Sie das NuGet-Paket installiert haben, können Sie alle gewünschten Dateien manuell ändern. Bearbeiten Sie sie einfach in VS (oder mit einem anderen Editor). Der einzige Unterschied zu NuGet-Paketen besteht darin, dass Ihre geänderten Dateien nicht entfernt werden, wenn Sie das Paket deinstallieren/aktualisieren, da zwischen den ursprünglichen Paketdateien und Ihren Dateien Änderungen festgestellt werden. Es wird eine Erwähnung davon geben, ist die Protokolle.

Update:

NuGet hat Abstützungen zum Modifizieren Projektdateien während einer Paketinstallation durch .transform and .pp files. Aber das hat seine Grenzen, .transform files fügt den Konfigurationsdateien Inhalt hinzu (sie können nicht bearbeiten), während .pp-Dateien für neue Quellcodedateien gedacht sind.

Sie können vorhandenen Quellcode mithilfe von EnvDte CodeModel in PowerShell (d. H. Install.ps1) ändern. Es ist jedoch ein bisschen komplexer.

+0

Das ist nicht ganz das, was ich meine. Ich meine, können Sie eine Datei über die Installation selbst ändern? Zum Beispiel habe ich gehört, dass Sie die Datei web.config im NuGet-Paket ändern können. Wie, eine Direktive oder ein Skript, etc? Ich stelle mir vor, dass Sie jede Datei über ein Skript ändern können, aber gibt es eine typische Vorgehensweise? Wenn Sie also ein Paket installieren, werden einige neue Dateien hinzugefügt, einige Ihrer vorhandenen Dateien werden jedoch geändert. Vielleicht ändern Sie den Inhalt von default.aspx zum Beispiel. Bekomme ich meine Bedeutung schon? – vbullinger

+1

habe es jetzt, ich habe meine Antwort oben aktualisiert. Kurz gesagt, Nuget hat Unterstützung für häufige einfache Szenarien in .pp/.transform-Dateien gebacken. Das Ändern von vorhandenem Code wird von NuGet nicht unterstützt und würde durch Powershell-Skripte erfolgen. Ich würde CodeModel betrachten, aber ich konnte kein einfaches Beispiel finden. –

+0

Ich sah Dinge über Dateien - ich glaube, die PP-Dateien - wo Sie Variablen statt Dinge wie Namespaces verlassen würde und es würde aus der Projektdatei usw., aber wie fügt das Entity Framework-Paket zum Beispiel hinzu die web.config Knoten? Ist es mit einem Skript? – vbullinger

2

Wenn Sie das JQuery NuGet-Paket im NuGet Package Explorer öffnen (oder einfach das Paket entpacken) und sich install.ps1 und common.ps1 ansehen, können Sie ein Beispiel sehen, in dem sie automatisch eine Zeile zu _references.js hinzufügen für JQuery, damit die JQuery-API in IntelliSense angezeigt wird.

Aber ja, es ist ein ziemlich komplexer Prozess, Code automatisch zu aktualisieren (besonders Code, den Leute bearbeiten können). Das JQuery-Beispiel beinhaltet die Verwendung eines regulären Ausdrucks, um nach einem vorhandenen Verweis zu suchen, bevor er aktualisiert wird. All dies bewirkt das Hinzufügen/Aktualisieren eines einzeiligen Kommentars zu einer bestimmten Datei an einem bekannten Speicherort (und sollte den Build nicht unterbrechen, wenn er vorhanden ist) geht schief, da es nur ein Kommentar ist).

Ich würde gerne mehr Beispiele und sogar eine Bibliothek von Hilfsfunktionen für Dinge wie die OP-Anfrage sehen.

Hier ist eine Funktion von common.ps1:

function AddOrUpdate-Reference($scriptsFolderProjectItem, $fileNamePattern, $newFileName) { 
    try { 
     $referencesFileProjectItem = $scriptsFolderProjectItem.ProjectItems.Item("_references.js") 
    } 
    catch { 
     # _references.js file not found 
     return 
    } 

    if ($referencesFileProjectItem -eq $null) { 
     # _references.js file not found 
     return 
    } 

    $referencesFilePath = $referencesFileProjectItem.FileNames(1) 
    $referencesTempFilePath = Join-Path $env:TEMP "_references.tmp.js" 

    if ((Select-String $referencesFilePath -pattern $fileNamePattern).Length -eq 0) { 
     # File has no existing matching reference line 
     # Add the full reference line to the beginning of the file 
     "/// <reference path=""$newFileName"" />" | Add-Content $referencesTempFilePath -Encoding UTF8 
     Get-Content $referencesFilePath | Add-Content $referencesTempFilePath 
    } 
    else { 
     # Loop through file and replace old file name with new file name 
     Get-Content $referencesFilePath | ForEach-Object { $_ -replace $fileNamePattern, $newFileName } > $referencesTempFilePath 
    } 

    # Copy over the new _references.js file 
    Copy-Item $referencesTempFilePath $referencesFilePath -Force 
    Remove-Item $referencesTempFilePath -Force 
} 
+0

Danke! Ein sehr "Hallo, Welt!" - Beispiel, um diese Art von Aufgabe zu bewältigen. – vbullinger

Verwandte Themen