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.
Wie gesagt ich brauche die Version. Auf diese Weise bekomme ich die Version nicht aus dem csproj – Daniel
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. –
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