在构建 Project2 之前在 Project1 上执行 "dotnet publish" 的正确方法是什么

What is the correct way to do a "dotnet publish" on Project1 before building Project2

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

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

将以下内容放入用于工作的 VSIX 项目的 post-build 事件中:

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

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

经过一番努力,我确定问题出在console app当时使用了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 又开始失败了。错误是:

The "MSBuild.Community.Tasks.Zip" task could not be loaded from the assembly C:\Users\MyUserName\.nuget\packages\msbuildtasks.5.0.235\build\..\tools\MSBuild.Community.Tasks.dll. Could not load file or assembly 'Microsoft.Build.Utilities.v4.0, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'. The system cannot find the file specified. Confirm that the declaration is correct, that the assembly and all its dependencies are available, and that the task contains a public class that implements Microsoft.Build.Framework.ITask.

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

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

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

社区 Zip 任务很旧,不再适用于最新版本的 MSBuild 或跨平台 dotnet CLI。

但是,VS 2017 15.8 和 CLI 2.1.400 引入了内置的 ZipDirectory task,您可以改用它。