首页 > 解决方案 > 在构建 Project2 之前在 Project1 上执行“dotnet publish”的正确方法是什么

问题描述

我有 2 个项目的解决方案。一个是 VSIX,另一个是 .NET Core 2.1 控制台应用。

这些项目不直接相互依赖,但我需要确保 VSIX 在构建时嵌入来自其他项目的所有输出文件的新版本,因为它将在运行时需要它们。

将以下内容放入用于工作的 VSIX 项目的构建后事件中:

cd "$(SolutionDir)MyCoreConsoleApp"
dotnet publish --configuration $(Configuration)

值得一提的是,这个设置在开始时存在一些奇怪的问题,但是......如果通过直接从解决方案资源管理器发出项目的重建来完成,控制台应用程序可以很好地构建。dotnet publish另一方面,从 VSIX 的构建前发布会因错误而失败,基本上是说构建系统无法找到所有必需的文件。

经过一番努力,我确定问题出在控制台应用程序当时使用 Fody Costura 的事实。删除此依赖项后,dotnet publish开始工作没有任何问题。

快进到昨天...我在控制台应用程序项目中添加了对 MSBuild 社区任务的依赖项,因为我想使用 Zip 任务将一些内容文件的压缩副本嵌入为 EmbeddedResource。我已经向 csproj 添加了一个自定义目标,并确认它在直接构建项目或dotnet publish从命令行发出时可以正常工作。如果它很重要,目标本身看起来像这样:

<Target Name="ZipAndEmbedWwwRoot" BeforeTargets="BeforeBuild">
  <CreateItem Include="wwwroot\**\*">
    <Output ItemName="ZipFiles" TaskParameter="Include" />
  </CreateItem>
  <Zip ZipFileName="$(IntermediateOutputPath)wwwroot.zip" WorkingDirectory="wwwroot" Files="@(ZipFiles)" />
  <ItemGroup>
    <EmbeddedResource Include="$(IntermediateOutputPath)wwwroot.zip">
      <LogicalName>wwwroot.zip</LogicalName>
    </EmbeddedResource>
  </ItemGroup>
</Target>

但是现在构建 VSIX 又开始失败了。错误是:

无法从程序集 C:\Users\MyUserName\.nuget\packages\msbuildtasks\1.5.0.235\build\..\tools\MSBuild.Community.Tasks.dll 加载“MSBuild.Community.Tasks.Zip”任务. 无法加载文件或程序集“Microsoft.Build.Utilities.v4.0,Version=4.0.0.0,Culture=neutral,PublicKeyToken=b03f5f7f11d50a3a”。该系统找不到指定的文件。确认声明正确,程序集及其所有依赖项都可用,并且任务包含实现 Microsoft.Build.Framework.ITask 的公共类。

一旦我删除了自定义目标,事情就会重新开始。

我开始认为在调用dotnet publish具有额外 msbuild 依赖项的项目时我可能会遗漏一些东西。这可能也是 Fody Costura 不起作用的原因。

所以问题是,那我应该怎么做呢?

标签: c#msbuildpost-build-event

解决方案


社区 Zip 任务相当陈旧,不再适用于最新版本的 MSBuild 或跨平台dotnetCLI。

但是,VS 2017 15.8 和 CLI 2.1.400 引入了您可以使用的内置ZipDirectory任务。


推荐阅读