Jak dodać numer wersji do pliku wyjściowego projektu VS Setup
Czy istnieje sposób, aby dołączyć numer wersji jako część wyjścia.nazwa pliku msi w projekcie instalacyjnym VS2008?
Chciałbym na przykład plik wyjściowy o nazwie: "myinstaller-1.0.13.msi", gdzie część wersji jest automatycznie ustawiana na podstawie numeru wersji, który umieściłem we właściwościach projektu wdrożenia.
6 answers
Nie jestem pewien, czy nadal tego potrzebujesz, czy nie, ale chciałem odpowiedzieć na to, ponieważ wykonaliśmy podobną operację w zdarzeniu postbuild. Jeśli chodzi o badania, które zrobiłem, nie jest to możliwe, aby ustawić nazwę pliku, jak chcesz wewnętrznie poprzez proces konfiguracji.
Można to zrobić w inny sposób, nazywając plik wyjściowy przez zewnętrzną aplikację w zdarzeniu post build.
Oto co możesz zrobić:
W zdarzeniu post build- >
[Msirenamerappath]\MsiRenamer.exe "$(BuildOutputPath) "
Utwórz aplikację, która zmieni nazwę pliku msi z numerem wersji z projektu wdrożeniowego. Poniżej znajduje się kod używany do aplikacji. To powinno spełnić twoje wymagania.
Uzyskanie kodu właściwości msi jest używane z alteridem artykułu
class MsiRenamer
{
static void Main(string[] args)
{
string inputFile;
string productName = "[ProductName]";
if (args.Length == 0)
{
Console.WriteLine("Enter MSI file:");
inputFile = Console.ReadLine();
}
else
{
inputFile = args[0];
}
try
{
string version;
if (inputFile.EndsWith(".msi", StringComparison.OrdinalIgnoreCase))
{
// Read the MSI property
version = GetMsiProperty(inputFile, "ProductVersion");
productName = GetMsiProperty(inputFile, "ProductName");
}
else
{
return;
}
// Edit: MarkLakata: .msi extension is added back to filename
File.Copy(inputFile, string.Format("{0} {1}.msi", productName, version));
File.Delete(inputFile);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
static string GetMsiProperty(string msiFile, string property)
{
string retVal = string.Empty;
// Create an Installer instance
Type classType = Type.GetTypeFromProgID("WindowsInstaller.Installer");
Object installerObj = Activator.CreateInstance(classType);
Installer installer = installerObj as Installer;
// Open the msi file for reading
// 0 - Read, 1 - Read/Write
Database database = installer.OpenDatabase(msiFile, 0);
// Fetch the requested property
string sql = String.Format(
"SELECT Value FROM Property WHERE Property='{0}'", property);
View view = database.OpenView(sql);
view.Execute(null);
// Read in the fetched record
Record record = view.Fetch();
if (record != null)
{
retVal = record.get_StringData(1);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(record);
}
view.Close();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(view);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(database);
return retVal;
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-07-08 16:15:16
Nie chciałem używać .metoda exe powyżej i miał trochę wolnego czasu, więc zacząłem kopać wokół. Używam VS 2008 na Windows 7 64 bit. Kiedy mam projekt instalacyjny, nazwijmy go MySetup wszystkie szczegóły projektu można znaleźć w pliku $(ProjectDir)MySetup.vdproj.
Wersja produktu zostanie znaleziona w jednym wierszu w tym pliku w postaci
ProductVersion="8:1.0.0"
W projekcie instalacyjnym występuje zdarzenie post-build. Jeśli wybierzesz projekt instalacji i wciśniesz F4 otrzymasz zupełnie inny zestaw właściwości niż po kliknięciu prawym przyciskiem myszy i wybraniu właściwości. Po naciśnięciu F4 zobaczysz, że jeden z PostBuildEvent jest. Ponownie zakładając, że projekt instalacyjny nazywa się MySetup, poniższy ustawi nazwę .msi zawierać datę i wersję
set datevar=%DATE:~6,4%%DATE:~3,2%%DATE:~0,2%
findstr /v PostBuildEvent $(ProjectDir)MySetup.vdproj | findstr ProductVersion >$(ProjectDir)version.txt
set /p var=<$(ProjectDir)version.txt
set var=%var:"=%
set var=%var: =%
set var=%var:.=_%
for /f "tokens=1,2 delims=:" %%i in ("%var%") do @echo %%j >$(ProjectDir)version.txt
set /p realvar=<$(ProjectDir)version.txt
rename "$(ProjectDir)$(Configuration)\MySetup.msi" "MySetup-%datevar%-%realvar%.msi"
Przeprowadzę Cię przez powyższe.
Datevar jest aktualną datą w formie YYYYMMDD.
Linia findstr przechodzi przez MySetup.vdproj, usuwa dowolną linię z PostBuildEvent w, następnie zwraca pojedynczą linię z włączonym productVersion i wysyła ją do pliku. Następnie usuwamy cudzysłowy, spacje, zamieniamy kropki w podkreślenia.
Linia for rozdziela pozostały ciąg znaków na dwukropku i pobiera drugą część i wysyła ją ponownie do pliku.
Następnie ustawiamy realvar na wartość pozostawioną w pliku i zmieniamy nazwę MySetup.msi, aby podać datę i wersję.
Tak więc, biorąc pod uwagę powyższą wersję produktu, gdyby to było 27 marca 2012 plik zmieniłby nazwę do
MySetup-20120327-1_0_0.msi
Oczywiście za pomocą tej metody można pobrać dowolną ze zmiennych w pliku vdproj i dołączyć je do nazwy pliku wyjściowego i nie musimy budować żadnych dodatkowych .programy exe do tego.
HTH
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-27 13:58:08
To samo pojęcie co odpowiedź Jima Grimmetta, ale z mniejszymi zależnościami:]}
FOR /F "tokens=2 delims== " %%V IN ('FINDSTR /B /R /C:" *\"ProductVersion\"" "$(ProjectDir)MySetupProjectName.vdproj"') DO FOR %%I IN ("$(BuiltOuputPath)") DO REN "$(BuiltOuputPath)" "%%~nI-%%~nxV%%~xI"
Niektóre punkty uwagi:
MySetupProjectName.vdproj
należy zmienić nazwę pliku projektu. Pominięcie zmiany powoduje błąd kompilacji: 'PostBuildEvent' failed with error code '1'
, a okno Output
pokazuje, który Plik FINDSTR
nie może się otworzyć.
Opis krok po kroku:
FINDSTR /B /R /C:" *\"ProductVersion\"" $(ProjectDir)MySetupProjectName.vdproj
- znajduje linię
"ProductVersion" = "8:x.y.z.etc"
z pliku projektu.
FOR /F "tokens=2 delims== " %%V IN (...) DO ... %%~nxV ...
- jest to używane do analizuje
x.y.z.etc
część z powyższego wyniku.
$(BuiltOuputPath)
- jest to oryginalna ścieżka wyjściowa, zgodnie z tym, co jest napisane w "makrach" linii poleceń zdarzenia po zbudowaniu.
FOR %%I IN (...) DO ... %%~nI-%%~nxV%%~xI
- służy do konwersji ciągu
foo.msi
nafoo-x.y.z.etc.msi
.
REN "$(BuiltOuputPath)" ...
- to tylko zmienia nazwę ścieżki wyjściowej na nową nazwę.
FOR ... DO FOR .. DO REN ...
- jest napisane w jednej linijce tak, że błąd po drodze czysto niszczy budowę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-12-26 05:34:32
Jeśli używasz projektu WIX (w przeciwieństwie do projektu instalacji i wdrożenia VS), Ten artykuł wyjaśnia dokładnie, jak osiągnąć to, czego szukasz.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-11-02 16:03:51
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using WindowsInstaller;
// cscript //nologo "$(ProjectDir)WiRunSql.vbs" "$(BuiltOuputPath)" "UPDATE `Property` SET `Property`.`Value`='4.0.0.1' WHERE `Property`='ProductVersion'"
// "SELECT `Property`.`ProductVersion` FROM `Property` WHERE `Property`.`Property` = 'ProductVersion'"
/*
* That's a .NET wrapper generated by tlbimp.exe, wrapping the ActiveX component c:\windows\system32\msi.dll.
* You can let the IDE make one for you with Project + Add Reference, COM tab,
* select "Microsoft Windows Installer Object Library".
*/
namespace PostBuildEventModifyMSI
{
/* Post build event fro Rename MSI file.
* $(SolutionDir)PostBuildEventModifyMSI\bin\Debug\PostBuildEventModifyMSI.exe "$(SolutionDir)TestWebApplicationSetup\Debug\TestWebApplicationSetup.msi"
*/
[System.Runtime.InteropServices.ComImport(), System.Runtime.InteropServices.Guid("000C1090-0000-0000-C000-000000000046")]
class Installer { }
class Program
{
static void Main(string[] args)
{
#region New code.
string msiFilePath = string.Empty;
if (args.Length == 0)
{
Console.WriteLine("Enter MSI file complete path:");
msiFilePath = Console.ReadLine();
}
else
{
Console.WriteLine("Argument Received args[0]: " + args[0]);
msiFilePath = args[0];
}
StringBuilder sb = new StringBuilder();
string[] words = msiFilePath.Split('\\');
foreach (string word in words)
{
sb.Append(word + '\\');
if (word.Contains("Debug"))
{
break;
}
else
{
}
}
// Open a view on the Property table for the Label property
//UPDATE Property set Value = '2.06.36' where Property = 'ProductVersion'
Program p = new Program();
string version = p.GetMsiVersionProperty(msiFilePath, "ProductVersion");
string productName = p.GetMsiVersionProperty(msiFilePath, "ProductName");
string newMSIpath = sb.ToString() + string.Format("{0}_{1}.msi", productName, version);
Console.WriteLine("Original MSI File Path: " + msiFilePath);
Console.WriteLine("New MSI File Path: " + newMSIpath);
System.IO.File.Move(msiFilePath, newMSIpath);
#endregion
//Console.Read();
}
private string GetMsiVersionProperty(string msiFilePath, string property)
{
string retVal = string.Empty;
// Create an Installer instance
WindowsInstaller.Installer installer = (WindowsInstaller.Installer) new Installer();
// Open the msi file for reading
// 0 - Read, 1 - Read/Write
Database db = installer.OpenDatabase(msiFilePath, WindowsInstaller.MsiOpenDatabaseMode.msiOpenDatabaseModeReadOnly); //// Open the MSI database in the input file
// Fetch the requested property
string sql = String.Format(
"SELECT Value FROM Property WHERE Property='{0}'", property);
View view = db.OpenView(sql);
//View vw = db.OpenView(@"SELECT `Value` FROM `Property` WHERE `Property` = 'ProductVersion'");
view.Execute(null);
// Read in the fetched record
Record record = view.Fetch();
if (record != null)
{
retVal = record.get_StringData(1);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(record);
}
view.Close();
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(view);
System.Runtime.InteropServices.Marshal.FinalReleaseComObject(db);
return retVal;
}
}
}
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-03-22 11:13:51
Zrobiłem to z 2 linijkami w powershell.
$versionText=(Get-Item MyProgram.exe).VersionInfo.FileVersion
(Get-Content MySetup.vdproj.template).replace('${VERSION}', $($versionText)) | Set-Content MySetup.vdproj
Zmień nazwę swojego istniejącego .vdproj do MySetup.vdproj.szablon i wstaw "${VERSION} " gdziekolwiek chcesz wstawić wersję podstawowego pliku exe.
VS wykryje zmianę w pliku vdproj i zapyta, czy chcesz ją ponownie załadować.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-10-01 19:57:53