2015-07-23 9 views
5

Ich möchte ein Nuget-Paket erstellen, das nur enthält, was in meiner Nuspec-Datei angegeben ist, aber immer noch die Version von meinem Csproj. Um das Token zu verwenden, ich habe wie zu packen:Nuget Pack csproj mit Nuspec

nuget pack MyProj.csproj 

Aber wenn ich es so tun, fügt es einige Abhängigkeiten und erstellt einen unerwünschten Ordner in meinem nuget Paket. Meine nuspec Datei ist:

<?xml version="1.0" encoding="utf-8"?> 
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd"> 
    <metadata>  
    <id>Test</id> 
    <version>$version$</version> 
    <title>Test</title> 
    <authors>Test</authors> 
    <owners>Test</owners> 
    <requireLicenseAcceptance>false</requireLicenseAcceptance> 
    <description>Test</description> 
    <summary>Test</summary> 
    <releaseNotes>Test</releaseNotes> 
    <copyright>Test</copyright> 
    </metadata> 
    <files> 
    <file src="bin\Debug\*.dll" target="lib\net45" /> 
    <file src="bin\Debug\MyProj.Wpf.exe" target="lib\net45" /> 
    <file src="bin\Debug\MyProj.Wpf.exe.config" target="lib\net45" /> 
    </files> 
</package> 

Als ich das Pack-Befehl die Datei ausführen fügt sie zusätzliche die MyProj.Wpf.exe im Ziel = „lib \ net452“

Kann ich es nicht zu zwingen hinzufügen die Abhängigkeiten und diese extra Datei? Oder nur das zu tun, was in nuspec angegeben ist?

Antwort

-1

Es ist schon eine Weile her, seit ich diese Frage gestellt habe. Seitdem habe ich eine Lösung benutzt, die für mich funktioniert, also werde ich sie hier für jeden veröffentlichen, der sie braucht.

Ich habe eine .csproj erstellt, die die .nuspec-Datei ändert und ihre Version entsprechend der Assemblydatei von .csproj festlegt. Um die manuelle Arbeit zu reduzieren, habe ich eine .bat-Datei erstellt, die diese .exe mit Argumenten aufgerufen und das Installationsprogramm beendet hat. Ich habe Squirrel.Windows für die Installer-Erstellung verwendet.

Ich habe ein NuspectVersionSetter.csproj erstellt, um die Nuspec-Version festzulegen. Es gibt viele Möglichkeiten, dies zu implementieren, hier geht einfach:

static void Main(string[] args) 
{ 
    try 
    { 
     if (args.Length < 2) 
     { 
      throw new Exception("Args are not correct"); 
     } 
     var assemblyFilePath = args[0]; 
     var nuspecFilePath = args[1]; 
     IsFileValid(assemblyFilePath, ".cs"); 
     IsFileValid(nuspecFilePath, ".nuspec"); 
     var version = GetAssemblyVersion(assemblyFilePath); 
     if (string.IsNullOrEmpty(version)) 
     { 
      throw new Exception("Unable to get version"); 
     } 
     WriteNuspec(nuspecFilePath, version); 
    } 
    catch (Exception e) 
    { 
     Console.WriteLine(e.Message); 
     Console.ReadLine(); 
    } 
} 

static void WriteNuspec(string path, string version) 
{ 
    var lines = File.ReadAllLines(path); 
    string versionLine = null; 
    for(var i = 0; i < lines.Length; ++i) 
    { 
     var line = lines[i]; 
     if (line.Contains("<version>") && line.Contains("</version>")) 
     { 
      var init = line.IndexOf("<version>") + "<version>".Length; 
      var end = line.IndexOf("</version>"); 
      line = line.Remove(init, end - init); 
      lines[i] = line.Insert(init, version); 
      break; 
     } 
    } 
    File.WriteAllLines(path, lines); 
} 

static void IsFileValid(string file, string extension) 
{ 
    if (!File.Exists(file)) 
    { 
     throw new Exception("Invalid file path: " + file); 
    } 
    if (!file.EndsWith(extension)) 
    { 
     throw new Exception("Invalid file extension: " + file); 
    } 
} 

static string GetAssemblyVersion(string path) 
{ 
    var lines = File.ReadAllLines(path); 
    foreach(var line in lines) 
    { 
     if(line.Contains("AssemblyVersion") && !line.Contains(".*")) 
     { 
      var parts = line.Split('\"'); 
      if (parts.Length != 3) 
      { 
       break; 
      } 
      return parts[1]; 
     } 
    } 
    foreach (var line in lines) 
    { 
     if (line.Contains("AssemblyFileVersion") && !line.Contains(".*")) 
     { 
      var parts = line.Split('\"'); 
      if (parts.Length != 3) 
      { 
       break; 
      } 
      return parts[1]; 
     } 
    } 
    foreach (var line in lines) 
    { 
     if (line.Contains("AssemblyInformationalVersion") && !line.Contains(".*")) 
     { 
      var parts = line.Split('\"'); 
      if (parts.Length != 3) 
      { 
       break; 
      } 
      return parts[1]; 
     } 
    } 
    throw new Exception("Unable to get version"); 
} 

Wie bereits erläutert, bevor die .bat-Datei auch die Squirrel.Windows Installer Schöpfung gewickelt.

Kleine Beobachtungen über die .bat:

  • NuspecVersionSetter war die .exe aus dem CSPROJ erstellt oben
  • Dieses Beispiel nimmt Ihre NuspecVersionSetter.exe in einem Ordner in Ihrem CSPROJ ist daher einige Wege möglicherweise müssen
  • die Squirrel.Windows Version ist alt in diesem Beispiel eingestellt werden, Sie viele, es zu ändern brauche ich

die .bat-Datei verwendet wurde, die folgenden:

NuspecVersionSetter ../Properties/AssemblyInfo.cs mynuspec.nuspec 
nuget pack 
@echo off 
setlocal EnableDelayedExpansion 
for /f "tokens=*" %%G in ('dir *.nupkg /b /a-d /od') do (
    SET newest=%%G 
) 

"../../packages/squirrel.windows.1.2.1/tools/Squirrel" --releasify !newest! -g installing.gif 

Wenn es irgendwelche Fragen zu dieser Antwort sind, fragen Sie sie in den Kommentaren.

0

Wenn Sie mehr Kontrolle über die NuGet-Paketgenerierung (.nupkg) haben möchten, verwenden Sie einfach die .nuspec-Datei, anstatt die Projektdatei zu verwenden.

nuget pack MyProj.nuspec 

Oder Ihr Projekt ändern, so dass es .NET 4.5 und nicht NET 4.5.2 zum Ziel hat.

+0

Wie gesagt ich brauche die Version. Auf diese Weise bekomme ich die Version nicht aus dem csproj – Daniel

+0

Nein, Sie werden nicht die Version aus der Projektdatei erhalten. Sie müssten es in die .nupec einfügen. Die Verwendung von 'nugget pack ProjectFile.csproj' hat einige Einschränkungen. Sie müssen es also nicht verwenden oder den NuGet-Quellcode ändern, um das Problem zu beheben, oder Ihr Projekt ändern, damit es nicht auf .NET 4.5.2 abzielt. –

+0

Ich habe eine Konsole-Anwendung, die dies löst und eine Fledermaus, um die ganze Verpackung für mich zu tun, danke für die Zeit – Daniel