2015-01-13 7 views
6

Dies ist das umgekehrte Problem von dem, was ich in der Regel gelesen habe, die Leute versuchen, Dateien in das NuGet-Paket enthalten. Ich versuche Stop Datei von automatisch enthalten sein.NuGet Pack: ignorieren Standard enthält

Ich erstelle eine Bibliothek von vorkompilierten MVC-Ansichtsvorlagen (mit RazorGenerator.Mvc), .less Dateien und JavaScript, um diese nach Bedarf zu unterstützen. Die Idee ist, dass dies grundlegende Dinge sind, die auf alle unsere Seiten gehen.

standardmäßig nuget pack enthält alle Dateien Aktion beim Aufbau gekennzeichnet: Inhalt in Ihrem Projekt, das jedes neu erstellte Ansicht, .less Datei oder ein Skript wäre. Es scheint keine Option zu geben, dieses Verhalten zu überschreiben. Eine verwandte Frage hier präsentiert eine Lösung von empty <files> node in the .nuspec to stop all includes, aber ich möchte einige Dateien, nur nur diejenigen, die ich wähle.

nun als Notlösung, kann ich gehen, explizit nicht alles sein Inhalt (mit Keine statt), dann explizit Setup, welche Dateien ich tun und wollen nicht kopiert und wo ich sie wollen kopiert mit der .nuspec Datei. Wenn jedoch ein anderer Entwickler, z. B. mein zukünftiges Selbst, diesen Schritt vergisst, werden die neu hinzugefügten Dateien bei der nächsten Installation oder Aktualisierung in das Paket und dann in das Zielprojekt kopiert.

fand ich OctoPack, und das wird mit nichts standardmäßig sobald es einen <files> Knoten im .nuspec erkennt, aber ich bin nicht etwas anderes von Teamcity verwenden, und mein Build-Server-Skripte Umschreiben zu verstehen, wie man octoPack anstelle von nugget pack aufzurufen, erscheint mir nicht als eine großartige Option. OctoPack hat auch Einschränkungen; die Abhängigkeiten müssen manuell aufgelistet werden, die Ersetzungstoken für die .nuspec-Datei müssen in der Befehlszeile übergeben werden (anstatt von AssemblyInfo.cs gelesen zu werden), und es scheint einfach nicht so, dass das Tool für diese Verwendung gedacht war - sie selbst wenn Sie sagen, "OctoPack sollte nur auf Projekten installiert werden, die Sie bereitstellen werden - das bedeutet die Konsolenanwendungsprojekte, Windows-Dienstprojekte und ASP.NET-Webanwendungen. Komponententests, Klassenbibliotheken und andere unterstützende Projekte werden nicht ausgewählt." . " (OctoPack Documentation)

Die nächste Alternative, die ich versucht msbuild wurde mit der Content-Gruppe während der BeforeBuild Veranstaltung einfach auszulöschen:

<Target Name="BeforeBuild"> 
    <ItemGroup> 
     <Content Remove="**\*.*" /> 
     <None Include="**\*.*" /> 
    </ItemGroup> 
    <Message Text="Content files: @(Content)" Importance="High" /> 
</Target> 

Die Nachricht überprüft, ob der Inhalt Gruppe leer ist, aber nuget pack scheint nicht sich kümmern; Es enthält trotzdem alle Dateien.

Hat jemand erfolgreich ein Paket wie dieses erstellt, ohne alles manuell markieren zu müssen Build Aktion: Keine und ohne OctoPack verwenden?

Antwort

5

Es scheint, dass, wenn Sie nuget pack MyProject.nuspec aufrufen (statt nur nuget pack, die sowohl für die .csproj und .nuspec aussehen wird), können Sie das gewünschte Verhalten zu bekommen, obwohl Sie noch (wie bei OctoPack) Token Substitution und automatische verlieren Abhängigkeiten. Es ist also keine perfekte Lösung, die so etwas wie --no-default-content wäre, aber es macht den Job gut genug.

nuget pack MyProject.nuspec -Properties version={XYZ} (wo XYZ vom Build-Server ausgefüllt wird) werde ich zumindest sicherstellen, dass die Versionsnummer auch inkrementiert wird. Zum Beispiel könnte ich in der .nuspec

<version>1.1.0.$version$</version> setzen und einfach SVN Revision als letzten Teil verwenden.

+0

"Es ist also keine perfekte Lösung, die so etwas wie' --no-default-content' "wäre - eine perfektere Lösung würde Ihnen erlauben, etwas in die .nuspec-Datei zu schreiben, um dies zu kontrollieren. Wer wird sich daran erinnern, welche Parameter jedes Mal an "nugget" übergeben werden? – binki

+0

Jeder, der einen Continuous Integration Server verwendet, muss sich nicht daran erinnern. Jetzt muss ich daran denken, dass wenn ich eine neue Abhängigkeit hinzufüge oder eine Abhängigkeitsversion ändere, ich sie manuell zu dem nuspec hinzufügen muss, anstatt in der Lage zu sein, diese Daten aus packages.config zu lesen. –

0

Eine weitere Lösung (immer noch nicht ideal, aber zumindest können Sie die .csproj-Datei weiterreichen und ihre Vorteile nicht verlieren) ist das Löschen des Inhaltsordners der resultierenden .nupkg-Datei (durch Behandlung als .zip).

Eine einfache Möglichkeit, dies zu tun ist über ein Skript wie folgt aus:

Remove files from .zip file with Powershell

Beachten Sie, dass System.IO.Compression - dieses Skript verwendet - funktioniert nur mit Powershell 3.0 und 4.5 .NET.

Verwandte Themen