如何从MSI

时间:2017-02-16 10:20:43

标签: windows-installer vsix vs-extensibility visual-studio-2017

Visual Studio 2017似乎在可扩展性领域改变了很多东西 https://docs.microsoft.com/en-us/visualstudio/extensibility/breaking-changes-2017

以前关于从MSI安装VSIX的建议现在看来已经过时了(Deploying VSIX using MSI installer),但似乎没有关于如何实现它的信息。

VS2017 FAQ意味着VSIX安装程序可以(应该?)手动启动,这是推荐方法吗?

  

vsixinstaller.exe / q / appidinstallpath:“c:\ program files   (x86)\ Microsoft Visual Studio \ 2017 \ Enterprise \ Common7 \ IDE \ devenv.exe“   / appidname:“Visual Studio”/ logFile:   / skuName:Enterprise /skuVersion:15.0.25810.0   “KendoUI.Mvc.VSPackage.vsix”

它还要求您知道vsixinstaller.exe的路径。这是从哪里来的? 更新似乎MS工具vsixbootstrapper会找到vsixinstaller.exe并通过您的参数传递给它,因此无需直接找到它。

此外,您需要了解所安装的Visual Studio的所有版本,它看起来比应该Programmatically finding the VS2017 installation directory更复杂。

我错过了什么或现在这真的很复杂吗?

2 个答案:

答案 0 :(得分:4)

现在它真的很复杂。安装扩展可以触发VS安装程序以安装所需的工作负载,这些工作负载在通过MSI发生时都会失败。已经讨论过如何使其适用于WiX,结论是,如果不改变VSIXInstaller.exe的工作方式,它就无法安全地工作:http://lists.wixtoolset.org/pipermail/wix-devs-wixtoolset.org/2017-February/thread.html

答案 1 :(得分:0)

经过研究,我认为目前我们有以下选择:

  1. 在VS扩展内容和其他所有内容之间分割安装工作负载:扩展进入Marketplace,并从Visual Studio中安装。看起来这是MS推动所有人使用的方案。您旧的MSI中所有其他无法进入扩展程序的内容仍必须以其他方式进行部署。您可以继续在扩展代码中实施一些检查,以测试是否安装了其他工具,并在缺少某些内容的情况下引导用户使用MSI。现在WIX工具自己使用此方案来安装VS扩展(从 gallery ...嗯:市场)。而且,用户必须单独安装MSI ...
  2. 使用自定义方法(自定义操作等)找到找到的最新VS版本/实例。使用相应的VSIXInstaller.exe从您的MSI安装扩展。基本上,这与我们多年来喜欢的老式方式相对应。但是,请记住以下注意事项:a)WIX中的VSExtension.VSIXPackage元素现在已变得毫无用处:它无法检测到最新的VS2017实例(出于某些合理但不一定充分的原因,IMO)。 b)您的扩展程序应具有“ Visual Studio核心编辑器”作为 only 的先决条件。基本上,它可能取决于触发VSIXInstaller时已经安装的所有内容。否则,由于Bob Arnsons answer中列出的原因,安装将失败。 c)如果某些VS进程正在(仍)运行,则VSIX安装程序现在在安静模式下将失败。确保将它们全部关闭或以GUI模式运行VSIXInstaller,以使用户有机会手动等待/退出它们。
  3. 使用VSIXBootstrapper.exe:该工具检测到最新的VS版本,并使用其VSIXInstaller.exe来安装到找到的所有实例中。但是,上面的问题仍然存在,因此该工具一定不是从MSI而是从引导程序本身触发的,这样就不必担心先决条件!工具github页面上提供了sample WIX code。由于使用这种方法,扩展名是由<ExePackage>安装的,因此您必须考虑一种新的卸载策略。
  4. 漫长而漫长的安装扩展程序。这包括:
    • 检测Visual Studio的所有实例:对于15之前的所有VS版本,都有固定的注册表项,对于15或更高版本,有一个COM API可从自定义操作或自定义安装脚本中查询实例。
    • 将所有必需的二进制文件复制到(特定于实例版本的)文件夹中,并
    • 将各自的注册执行到Visual Studio实例中。

我没有对选项4进行更深入的研究。对我们来说,选项3是足够的。 VSIXInstaller提供了一些有用的新命令行开关,例如/ p / sp / f等。该开关允许以“相当”模式执行安装。当然,如果缺少必要的先决条件或无法关闭阻止进程,则这将失败。或应用于较旧的VSIX安装程序(对于多实例安装程序很重要!)。
进一步注意,VS2017的VSIXInstaller.exe也会等待MSBuild关闭。不幸的是,我们的构建脚本正在测试新创建的安装程序...它将不再起作用。