为什么我的VSIX解决方案的构建和重建不产生相同的输出

时间:2019-08-15 11:31:35

标签: visual-studio msbuild visual-studio-extensions

我的项目是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。

1 个答案:

答案 0 :(得分:2)

  

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

是的,该解决方案构建良好,并且具有预期的行为。请参见this,重建过程为clean+build,因此这两种方式均可正常工作。无论rebuild还是clean and build,它们都将构建您解决方案中的所有项目。这样,MultiLangCodeParser.dll可以被MultiLanguageWPF识别并将其包含在vsix软件包中。

  

但是,如果我没有先清洗就构建解决方案,至少   VSIX安装中省略了一个dll。这个特定的DLL是   二级项目参考的输出。

如果我在MultiLanguageWPF项目中进行了某些更改,请现在构建解决方案,因为我没有对MultiLanguageLegacyMultiLangCodeParser进行任何更改,因此VS实际上不会构建这两个项目,它只会自行构建顶级MultiLanguageWPF项目,类似于:

enter image description here

当vs仅构建顶层项目而未重建第一级和第二级项目时,构建引擎将仅从MultiLanguageWPF.csproj中读取内容,在此文件中,它仅定义对MultiLanguageLegacy的包引用,因此它在.vsix中将包含MultiLanguageLegacy.dll,但不会复制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>

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