2015-07-23 14 views
5

Sadece nuspec dosyasımda belirtilenleri içeren bir nuget paketi oluşturmak istiyorum, ancak yine de sürümü csproj'umdan alın. jetonu kullanmak için ben gibi bavul zorunda:nuspec kullanarak netspace csproj

nuget pack MyProj.csproj 

Ama hiç böyle bunu yaparken bazı bağımlılıkları ekler ve benim Nuget paketinde istenmeyen bir klasör oluşturur. Benim nuspec dosyasıdır:

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

Ben paketi komutunu dosyasını çalıştırdığınızda ekstra ekler hedefin = "lib \ net452"

ben eklemek değil zorlamak Can içinde MyProj.Wpf.exe olduğunu bağımlılıklar ve bu ekstra dosya? Ya da sadece nuspec'te belirtilen şeyi yapmak?

cevap

-1

Bu soruyu gönderdiğim bir süredir. O zamandan beri benim için çalışan bir çözüm kullandım, bu yüzden onu ihtiyacı olan herkes için buraya göndereceğim.

.nuspec dosyasını değiştiren ve onun sürümünü .csproj derleme dosyasına göre ayarlayan bir .csproj oluşturdum. El ile çalışmayı azaltmak için bu .exe dosyasını argümanlar olarak adlandırılan ve yükleyiciyi oluşturmayı bitiren bir .bat dosyası oluşturdum. Yükleyici oluşturma için Squirrel.Windows kullandım.

Nuspec sürümünü ayarlamak için bir NuspectVersionSetter.csproj oluşturdum. Bunu uygulamak için pek çok yöntem Burada basit bir gider vardır: .bat dosyası da Squirrel.Windows yükleyici oluşturma sarılmış önce

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

olarak açıkladı. .bat hakkında

Küçük gözlemler:

  • NuspecVersionSetter Bu örnek sizin NuspecVersionSetter.exe, senin .csproj bir klasörün içinde bu nedenle bazı yollar olduğunu varsayar
  • yukarıdaki .csproj oluşturulan .exe oldu Eğer pek çok kişi

ben takip ediyordum kullanılan .bat dosyasını değiştirmeniz gerekir,

  • Squirrel.Windows sürümü bu örnekte eskidir ayarlanması gerekebilir:

    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 
    

    Bu yanıtla ilgili herhangi bir soru varsa, bunları yorumlarda sorun.

  • 0

    NuGet paket oluşturma (.nupkg) üzerinde daha fazla denetime sahip olmak istiyorsanız, proje dosyasını kullanmak yerine doğrudan .nuspec dosyasını kullanın. Veya projenizi değiştirecek şekilde değiştirin veya .NET 4.5 ve .NET 4.5.2'yi hedeflemeyecek şekilde projenizi değiştirin.

    +0

    Sürümüne ihtiyacım var dediğim gibi. Bu şekilde csproj – Daniel

    +0

    versiyonunu alamayacağım. Hayır, proje dosyasından sürüm almazsınız. Onu .nuspec'e koymanız gerekecek. 'Nuget pack ProjectFile.csproj' kullanımı bazı kısıtlamalara sahiptir. Bu nedenle, onu kullanmamanız veya sorunu gidermek için NuGet kaynak kodunu değiştirmeniz veya projenizi değiştirmemesi için .NET 4.5.2'yi hedeflemiyorsunuz. –

    +0

    Bu ve bir yarasayı çözdüğüm bir Konsol Uygulamasını benim için tamamladım, zaman için teşekkürler – Daniel