2015-07-23 10 views
5

Chcę utworzyć pakiet nuget, który zawiera tylko to, co jest określone w moim pliku Nuspec, ale nadal uzyskać wersję z mojego csproj. W celu korzystania z tokena muszę się pakować jak:Nuget pack csproj przy użyciu nuspec

nuget pack MyProj.csproj 

Ale kiedy robię to w ten sposób, że dodaje kilka zależności i tworzy niechciany folder w moim pakiecie Nuget. Mój plik nuspec jest:

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

Kiedy uruchomić komendę Pack plik dodaje dodatkowo jest MyProj.Wpf.exe w target = „lib \ net452”

mogę zmusić go, aby nie dodawać zależności i ten dodatkowy plik? Lub zrobić tylko to, co jest określone w Nuspec?

Odpowiedz

-1

Minęło trochę czasu odkąd opublikowałem to pytanie. Od tego czasu użyłem rozwiązania, które zadziałało dla mnie, więc zamierzam opublikować je tutaj dla każdego, kto tego potrzebuje.

Utworzono plik .csproj, który modyfikuje plik .nuspec i ustawia jego wersję zgodnie z plikiem zespołu pliku .csproj. Aby ograniczyć pracę ręczną, utworzyłem plik .bat, który wywołał ten plik .exe z argumentami i zakończył tworzenie instalatora. Użyłem Squirrel.Windows do stworzenia instalatora.

Stworzyłem NuspectVersionSetter.csproj, aby ustawić wersję nuspec. Istnieje wiele sposobów, aby zaimplementować to, tu idzie prosta:

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"); 
} 

Jak wyjaśniono wcześniej plik .bat owinięty również tworzenie instalatora Squirrel.Windows.

Małe obserwacje dotyczące .bat:

  • NuspecVersionSetter był .exe tworzony z .csproj powyżej
  • Przykład ten zakłada swoją NuspecVersionSetter.exe jest wewnątrz folderu w .csproj, dlatego niektóre ścieżki może być konieczne dostosowanie
  • wersja Squirrel.Windows jest stary w tym przykładzie wiele trzeba zmienić go

plik .bat I używany był następujący:

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 

Jeśli są jakieś pytania dotyczące tej odpowiedzi, poproś ich w komentarzach.

0

Jeśli chcesz mieć większą kontrolę nad generowaniem pakietów NuGet (.nupkg), po prostu użyj pliku .nuspec bezpośrednio, zamiast używać pliku projektu.

nuget pack MyProj.nuspec 

Lub zmodyfikuj swój projekt tak, aby był ukierunkowany na .NET 4.5, a nie NET 4.5.2.

+0

Tak jak powiedziałem, potrzebuję wersji. W ten sposób nie dostanę wersji z csproj – Daniel

+0

Nie, nie dostaniesz wersji z pliku projektu. Będziesz musiał umieścić go w .nuspec. Użycie 'pakietu nugetowego ProjectFile.csproj' ma pewne ograniczenia. Pozostaje ci brak używania go lub modyfikowanie kodu źródłowego NuGet w celu rozwiązania problemu lub zmiana projektu, aby nie był on docelowym .NET 4.5.2. –

+0

Stworzyłem aplikację konsolową, która rozwiązuje to i nietoperza, aby zrobić dla mnie całe opakowanie, dzięki za czas – Daniel

Powiązane problemy