visual-studio - 为什么我的 VSIX 解决方案的构建和重建没有生成相同的输出
问题描述
我的项目是 Visual Studio 扩展。该解决方案包含多个项目并引用多个 NuGet 包。我使用的是 Visual Studio 2019 版本 16.2.1,我使用的是 Microsoft.VSSDK.BuildTools 版本 16.2.3073。
如果我重建整个项目,或者如果我在构建之前清理解决方案,那么一切似乎都正确构建。
但是,如果我在没有先清理解决方案的情况下构建解决方案,则 VSIX 安装中至少会省略一个 dll。这个特定的 DLL 是二级项目参考的输出。
我的顶级 VSIX 项目是 MultiLanguageWPF。这具有对 MultiLanguageLegacy 的项目引用,而后者又具有对 MultiLangCodeParser 的项目引用。生成后,VSIX 中缺少文件 MultiLangCodeParser.dll。
MultiLanguageWPF
|
+-- MultiLanguageLegacy
|
+-- MultiLangCodeParser
当我使用 F5 启动调试器时会出现同样的问题,除非我先清理项目(这特别烦人)。
如何防止这种不同的构建和重建行为?
顺便说一句,构建我的解决方案总是构建顶级项目 MultiLanguageWPF,即使它刚刚构建。
解决方案
如果我重建整个项目,或者如果我在构建之前清理解决方案,那么一切似乎都正确构建。
是的,该解决方案构建良好,并且是预期的行为。看到这个,重建是clean+build
,所以这两种方式都可以正常工作。无论是rebuild
还是clean and build
,他们都会在您的解决方案中构建所有项目。这样,MultiLangCodeParser.dll
MultiLanguageWPF 可以识别并将其包含在 vsix 包中。
但是,如果我在没有先清理解决方案的情况下构建解决方案,则 VSIX 安装中至少会省略一个 dll。这个特定的 DLL 是二级项目引用的输出。
如果我在MultiLanguageWPF
项目中更改某些内容,现在构建解决方案,因为我没有对 and 进行任何更改MultiLanguageLegacy
,MultiLangCodeParser
VS 不会真正构建这两个项目,它只会构建顶级MultiLanguageWPF
项目本身,类似于这样:
当vs只构建顶级项目而不重新构建第一和第二级项目时,构建引擎只会从MultiLanguageWPF.csproj中读取内容,在这个文件中它只定义了对的包引用MultiLanguageLegacy
,所以它会包含MultiLanguageLegacy.dll
在.vsix中,但不会复制 MultiLangCodeParser.dll,因为在这种情况下构建引擎不知道MultiLanguageLegacy.dll
依赖于MultiLangCodeParser.dll
. 它没有从 MultiLanguageLegacy.csproj 中读取数据并构建它,所以我认为如果只构建顶级项目,引擎将不知道一级和二级项目之间的依赖关系。
解决方法:
我可以重现相同的问题并且它确实存在,您当前解决方案的解决方法可以将以下脚本添加到MultiLanguageWPF.csproj
:(假设您的三个项目在同一个解决方案文件夹中)
<Target Name="AddCustomItem" AfterTargets="GetVsixSourceItems">
<ItemGroup>
<VSIXSourceItem Include="..\MultiLangCodeParser\bin\$(Configuration)\MultiLangCodeParser.dll" />
</ItemGroup>
</Target>
然后这个烦人的问题似乎在我的机器上消失了。
推荐阅读
- python - 如何在嵌套字典中选择元素并递归删除它们
- javascript - 使用 gatsby 和 react pdf 导入 PDF,返回错误
- html - 放大太远时 box-shadow 消失
- python-3.x - AWS 读取 utf-8 文件 pycaption.detect_format 返回 None
- google-cloud-platform - 尝试协调/刷新 terraform 基础设施漂移
- .net - 如何在 .net 核心应用程序中使用 powershell 启动 Windows 服务?
- typescript - 如何定义具有键类型和值类型之间相关性的 Map,而它们都是联合
- javascript - 无法检测在画布 javascript 中绘制的对象的碰撞
- python - 以概率从列表中选择一个字符串
- angular - 在 Angular 中创建第二个路由器出口时解析错误