VSIX Flavored项目自定义.target文件导入问题

时间:2011-07-08 16:07:49

标签: visual-studio-2010 msbuild-task vsix

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

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

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

如果有人能提出解决这个问题的方法,那将会很棒。我已经没时间了,已经尝试了很多东西而没有任何成功:(

1 个答案:

答案 0 :(得分:2)

[包括我先前通过电子邮件询问同一问题的回复。]

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

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

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

  1. 放弃VSIX并使用MSI进行部署(建议的方法)
  2. 在项目模板中包含自定义目标。这很糟糕,因为现在目标分散在项目中而不是安装到一个位置,但它可能是一个可接受的解决方案。
  3. 在VS中的软件包/扩展程序的“首次启动”中进行一些初始化(例如设置环境变量)。当然,这意味着用户必须知道这是必要的安装后步骤。
  4. 我意识到这些解决方案都不是理想的。请注意,使用VSIX获得更好的MSBuild支持是我们最需要的功能,所以我们肯定收到了反馈。