2

我有一个 VSIX 包,其中包含几个基于 XML 的自定义设计器。这个包有一个特殊的项目系统,我在其中使用一些自定义构建任务在构建时自动生成代码。

我必须面对的第一个挑战是在我的项目模板中导入 .targets 文件。我无法在项目模板中提供 .targets 文件的完全限定路径,因为我的包版本发生了变化,这使得 vsix 安装程序将其放置在目标计算机上的版本化位置中。我可以解决的方法是添加一个带有包根路径的用户环境变量,然后在项目模板中引用这个环境变量来导入 .targets 文件。它按预期工作,但需要注意。

现在需要注意的是如何在 VSIX 部署过程中创建此环境变量。我尝试使用派生自RegistrationAttribute. 我覆盖了 Register 方法来运行Environment.SetEnvironmentVariable(),它仅在我在开发盒上运行项目时才有效。显然,VSIXInstall.exe 并不关心在安装过程中运行属性寄存器。

如果有人可以提出解决此问题的方法,那就太好了。我的时间不多了,已经尝试了很多事情但没有成功:(

4

1 回答 1

2

[包括我之前对通过电子邮件提出的相同问题的回复。]

Visual Studio 2010 不支持通过 VSIX 分发的 MSBuild 目标/任务。建议您使用 MSI(或类似的部署技术)并将目标文件拖放到您在 %ProgramFiles%\MSBuild 下选择的目录中。然后,您可以通过 $(MSBuildExtensionsPath) 在项目模板中引用它们。

VSIX 安装本质上只是 VSIX 的“解压缩”。就是这样。没有任何注册或执行自定义操作的能力。正如您所提到的,在构建时,一个名为 CreatePkgDef.exe 的工具会运行(它会加载您的程序集并调用您的 RegistrationAttribute)来创建包含在您的 VSIX 中的 pkgdef 文件。

我认为您需要执行以下操作之一:

  1. 放弃 VSIX 并使用 MSI 进行部署(推荐的方法)
  2. 在项目模板中包含自定义目标。这很糟糕,因为现在目标分散在项目中,而不是安装到单个位置,但它可能是您可以接受的解决方案。
  3. 在 VS 中“首次启动”你的包/扩展时做一些初始化(例如设置你的环境变量)。当然,这意味着用户必须知道这是安装后的必要步骤。

我意识到这些解决方案都不是理想的。请注意,对 VSIX 更好的 MSBuild 支持是我们最需要的功能,因此我们肯定收到了反馈。

于 2011-07-09T01:22:27.097 回答