是的,但请记住,您的MSI不应该是主要的升级,否则将删除以前的版本(除非这就是你想要的东西,大概你想并排侧所以它们都可以同时安装)。
首先,明白你不应该硬编码组件GUID。尽管支持将相同组件的GUID转到不同的文件夹,但它会在更新和卸载方面造成很多问题,并且最好避免。维护也是一件痛苦的事情,所以只需使用组件的自动引导。
创建目录创作像这样(假设你在的ProductVersion变量传递):
<?define ProductName="MyProduct"?>
<?ifndef ProductVersion?>
<?define ProductVersion=1.0.0?>
<?endif?>
<Product Name="$(var.ProductName)" Version="$(var.ProductVersion)" ...>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="Program Files">
<Directory Id="INSTALLDIR" Name="$(var.ProductName)">
<Directory Id="VersionDir" Name="$(var.ProductVersion)"/>
</Directory>
</Directory>
</Directory>
</Product>
这仅仅是个目录表的示例代码段。我将INSTALLDIR定义为根产品路径,以便您控制进入每个版本目录的所有版本,以便用户不会意外踩过具有不同组件GUID的以前版本(不同的组件GUID到同一位置会导致在卸载时删除文件因为它们没有被重新计数)。
要安装的话,你可以这样做:
<Component Directory="VersionDir">
<File Source="foo.dll"/>
</Component>
注意,我没有指定GUID,也没有任何其他ID为这一问题。它们将被生成,并且GUID将保持稳定(也就是说,使用相同的版本,所有后续重建将具有相同的GUID,直到您更改版本 - 这正是它的工作方式)。
要查看正在使用的示例(以及如何从引用的C#项目中的文件获取版本),请参阅https://github.com/heaths/psmsi/tree/develop/src/Setup。
好吧,我没有问安装文件夹。我问了如何自动构建msi到版本号为 – Arti
的文件夹什么是“自动构建msi到文件夹”?构建MSI的要点是将东西安装到特定的文件夹。如果您正在讨论松散文件的源文件夹布局,则适用相同的建议。 Name属性是默认的目标和源名称,但您始终可以显式设置Source目录。 – Heath
我的意思是当你在Visual Studio中点击''Build'''按钮时,我想在新文件夹中找到'''.msi'''文件(文件夹的名字应该是程序的Assembly Version)。看到我的问题的结构。然后我想为服务器上的用户发布此文件夹,以便他们能够下载他们需要的版本。 而我的问题是:这是可能的自动执行,以防止版本的错误。 – Arti