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.
Tak jak powiedziałem, potrzebuję wersji. W ten sposób nie dostanę wersji z csproj – Daniel
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. –
Stworzyłem aplikację konsolową, która rozwiązuje to i nietoperza, aby zrobić dla mnie całe opakowanie, dzięki za czas – Daniel