问题
是否有一个固定解决方案可以检测(递归)给定visual studio项目文件的所有依赖项?这基本上是可视工作室设置项目的“检测到的依赖项”功能 - 但我需要以编程方式访问依赖项列表(最好是来自MSBuild)。
背景(如果您想了解我正在尝试解决的实际问题,请阅读
我正致力于使用第三方UI库的WinForms应用程序的自动构建。为了成功构建应用程序,必须在构建/开发机器上“安装”库(通过供应商的安装程序)(这会将程序集放入GAC并安装许可组件)。然后必须通过我们项目文件中的GAC引用供应商的dll。不幸的是,没有办法避免这种“安装”要求(我希望使用从我的源代码控制系统获取的本地引用,就像我几乎所有其他第三方引用一样,但这不可能在此情况)。
我们使用“插件”架构,因此可执行项目不直接引用任何这些组件 - 它们都是通过“插件”项目间接引用的(后者又由可执行项目引用)。因此,在“插件”项目中将GAC引用设置为“copy local = true”仅将供应商dll复制到插件项目的输出目录中;它们不会以递归方式复制到可执行项目的输出目录中。因此,可执行项目的输出目录的xcopy部署在没有安装这些供应商dll的计算机上不起作用,因为它们不在输出目录中。
我们目前使用msi部署(通过visual studio安装项目)并希望切换到xcopy部署。供应商dll目前正在打包到我们的msi中,因为依赖项是由安装项目的“检测到的依赖项”功能内部发生的任何魔法“检测到”的。我使xcopy部署工作的解决方案是要求可执行项目直接引用其引用的插件使用的供应商dll,并将“copy local”设置为true。为了确保以这种方式引用所有必需的供应商dll,我想生成可执行项目的“检测到的依赖项”列表,断言所有这些依赖项都存在于可执行项目的输出目录中,并且无法构建如果他们不在场。
我可以通过分析csproj文件,编译所有“Reference”条目的列表并递归地跟随项目引用来自己做到这一点。但是,我希望在某个地方有固定功能可以做到这一点 - 特别是考虑到“检测到的依赖关系”足够聪明,可以过滤掉框架dll,但包括我的GAC引用的供应商dll。
谢谢!
答案 0 :(得分:0)
最有可能你可以用Reflection解决这个问题 - 你的插件和它们的主机很可能有一个共同的接口契约。您的代码将在构建之后扫描所有程序集以使用一组已知的接口协定,并通过IDE可扩展性自动化将这些协议添加/更新到安装程序项目。编写一个手动刷新的插件可能是一个选项,编写和注册MSBuild任务就更好了。
我知道这不是'罐装解决方案',但所需的工作量应少于一个KLOC。