首页 > 解决方案 > 为什么我的 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,即使它刚刚构建。

标签: visual-studiomsbuildvisual-studio-extensions

解决方案


如果我重建整个项目,或者如果我在构建之前清理解决方案,那么一切似乎都正确构建。

是的,该解决方案构建良好,并且是预期的行为。看到这个,重建是clean+build,所以这两种方式都可以正常工作。无论是rebuild还是clean and build,他们都会在您的解决方案中构建所有项目。这样,MultiLangCodeParser.dllMultiLanguageWPF 可以识别并将其包含在 vsix 包中。

但是,如果我在没有先清理解决方案的情况下构建解决方案,则 VSIX 安装中至少会省略一个 dll。这个特定的 DLL 是二级项目引用的输出。

如果我在MultiLanguageWPF项目中更改某些内容,现在构建解决方案,因为我没有对 and 进行任何更改MultiLanguageLegacyMultiLangCodeParserVS 不会真正构建这两个项目,它只会构建顶级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>

然后这个烦人的问题似乎在我的机器上消失了。


推荐阅读