在构建Project2之前在Project1上进行“ dotnet发布”的正确方法是什么

时间:2018-10-12 08:52:08

标签: c# msbuild post-build-event

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

这些项目并不直接相互依赖,但是我需要确保VSIX在构建时嵌入了另一个项目中所有输出文件的新版本,因为在运行时将需要它们。

在用于工作的VSIX项目的构建后事件中添加以下内容:

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

值得一提的是,此设置在开始时就存在一些奇怪的问题,但是...如果可以通过直接从Solution Explorer发布项目的重建来完成控制台应用程序的构建,那么它可以正常运行。另一方面,从VSIX的构建前版本发布dotnet publish会失败,并显示错误,基本上是说构建系统无法找到所有必需的文件。

经过大量的努力,我确定问题出在控制台应用程序当时使用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再次开始失败。错误是:

  

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

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

我开始认为,在具有附加msbuild依赖项的项目上调用dotnet publish时,我可能会丢失一些东西。这也可能是Fody Costura也不工作的原因。

所以问题是,那么我应该如何

1 个答案:

答案 0 :(得分:1)

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

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