我们目前使用WiX来构建我们的MSI文件,因此它是我使用过的唯一一个MSI构建器.我知道您可以在Visual Studio中本地构建安装程序.使用WiX和Windows Installer有什么区别,各自的优缺点是什么?
如何避免WiX/MSI部署解决方案中的常见设计缺陷?
部署是大多数开发的关键部分 - 部署失败意味着您的最终用户永远无法评估您的产品.这很容易成为软件开发中最昂贵的错误.请给这个内容一个机会.我坚信,通过应用程序设计的微小变化可以显着提高软件质量,使部署更加合理,更可靠 - 这就是"答案"的全部 - 软件开发.
这是一个Q/A风格的问题,答案只列出了MSI文件中不要做的一些事情,以避免最常见的设计缺陷.
windows-installer installshield wix advanced-installer installshield-le
您可能知道,msiexec是一个命令行应用程序,可用于安装MSI文件.您可能知道,您可以在静默或不可见模式下运行它.
如果安装程序要求用户回答有关要安装的部件的具体问题,是否有一些方法可以在msiexec命令行中添加一系列选项来执行此操作?
我认为必须有某种方法来设置MSI文件的默认设置才能实现这一点.MSI文件是如何制作的?它们是通过微软的工具开发的吗?他们可以打开和编辑吗?
在我迄今为止编写的所有程序中,如果我希望它在另一个工作站上工作,我只需复制并粘贴使其运行所需的可执行文件和必要文件(例如:.o文件,二进制文件......).
但是所有为商业用途而构建的程序总是带有安装程序.例如PC游戏.所以我的问题是:当我们只是将文件复制到目标工作站时,安装的主要好处/原因是什么?
- 其中一个原因可能是防止盗版.但除此之外,我确定还有其他更强的理由吗?
我正在 InstallShield MSI 项目上使用 InstallShield 2016,并尝试创建一个带有更新可执行文件的次要补丁包。一切正常,但注册表值在更新后更改为默认值。
我已经考虑过更改 REINSTALLMODE 字符串,但对于将来利用注册表项系统来说,它可能限制太多。我还了解到使用 AppSearch 和 RegLocator 表将值读取到 msi 属性中。我不明白如何使用这些表,所以这是一个我不太明白的解决方案。
我缺少什么?
谢谢。
我正在尝试使用 electro-builder (版本 20.39.0)创建一个 .msi 安装程序文件,可以在安装时对其进行参数化。参数(例如服务器端点)应写入文件中。
示例:
然后应该出现在安装目录中MsiExec /i "MyProject.msi" SERVER_ENDPOINT=myapp.example.com
的myapp.example.com文件中。
我尝试编辑Electron-builder 的 wix 模板文件,添加以下内容以将 ${SERVER_ENDPOINT} 写入 server.txt
文件C:\...\MyProject\node_modules\electron-builder-lib\templates\msi\template.xml
...
<CustomAction Id="writeConfigFile" Directory="APPLICATIONFOLDER" Execute="commit" Impersonate="yes" ExeCommand="cmd.exe /c "echo ${SERVER_ENDPOINT} > server.txt"" Return="check" />
...
<InstallExecuteSequence>
...
<Custom Action="writeConfigFile" After="InstallFinalize"/>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
跑步与
MsiExec /i "MyProject.msi" /L*v Install.log SERVER_ENDPOINT=myapp.example.com
Run Code Online (Sandbox Code Playgroud)
我还没有工作。它安装但不显示writeConfigFile在日志文件中。
您认为这是使 msi 文件参数化的正确方法吗?
或者您会推荐另一种解决方案吗?
我还找到了 Orca.exe,用于创建 MST 文件,但我更喜欢一个简单的解决方案,无需手动步骤。
我有一个自定义操作,将文件添加到安装目录.卸载程序时,另一个自定义操作会尝试删除这些文件,以便删除安装目录.
问题是我的自定义卸载操作在删除标准安装文件后运行,因此安装目录保留在那里,尽管它是空的.
配置看起来类似于:
<CustomAction Id="AddFilesAction" BinaryKey="installerActions" DllEntry="AddFiles" Execute="deferred" Return="check" Impersonate="no" />
<CustomAction Id="CleanupAction" BinaryKey="installerActions" DllEntry="Cleanup" Execute="deferred" Return="check" Impersonate="no" />
<InstallExecuteSequence>
<Custom Action="CleanupAction" Before="InstallFiles">Installed</Custom>
<Custom Action="AddFilesAction" After="InstallFiles">NOT Installed</Custom>
</InstallExecuteSequence>
Run Code Online (Sandbox Code Playgroud)
我可以在CleanupActionmsi开始删除安装文件之前运行,以便自定义文件已被删除,msi可以删除主安装目录吗?
我正在尝试在服务器上安装 Windows 服务,当以管理员身份运行命令行并导航到 InstalUtil.cmd 文件并运行它时,我收到错误“msiexec failed: 1603”,但是该服务确实已安装并且按预期完美运行。有任何想法/建议来修复错误消息吗?
我们使用Visual Studio 2013在vb.net中开发了一个软件.现在我们要构建一个具有以下步骤/功能的自定义安装程序:
它几乎像Adobe或Corel注册过程.我们对其他技术持开放态度,这些技术必须确保我们的软件必须仅安装在一台机器上.请注意,我们是一群新手程序员(不是那么先进水平),所以; 如果这个过程得到详细阐述,对我们非常有帮助.
我们的客户端仅允许在以管理员身份登录时安装应用程序。必须为机器的当前用户安装需要安装的应用程序。该应用程序安装正常,当我需要在用户的 appdata/user 配置文件文件夹中放置一个配置文件时,我的问题就出现了。由于这是他们想要的地方,目前配置正在安装时被删除到管理员配置文件中。我如何解决这个问题,有没有办法让我检查安装是否有其他配置文件并可能写信给他们,但这感觉很脏。
在我的WIX项目中,我有一个像这样的目录结构:
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="INSTALLLOCATION" Name="FolderName">
...
</Directory>
<Directory Id="MYDIRECTORY" Name="SomeDifferentDirectory">
...
</Directory>
</Directory>
Run Code Online (Sandbox Code Playgroud)
这里INSTALLLOCATION代表我程序的安装文件夹,但是我想另外创建另一个安装目录之外的目录,例如D:\MyFolder1\MyFolder2,从上面的例子中我如何分配这个值,MYDIRECTORY以便在安装完成后创建它?
wix ×8
installer ×4
installation ×3
windows ×2
c# ×1
command-line ×1
deployment ×1
msitransform ×1
orca ×1
profiles ×1
upgrade ×1
vb.net ×1
wix3.11 ×1
wix3.7 ×1