c# - 在构建 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 不起作用的原因。
所以问题是,那我应该怎么做呢?
解决方案
社区 Zip 任务相当陈旧,不再适用于最新版本的 MSBuild 或跨平台dotnet
CLI。
但是,VS 2017 15.8 和 CLI 2.1.400 引入了您可以使用的内置ZipDirectory
任务。
推荐阅读
- python - 如何在 QML 中使用 QtWebEngine
- node.js - 如何在 Foreach 中同步运行 Mongoose Find
- html - 按元素抓取网页
- ios - 如何在 Xcode 中正确设置 UIButtons(图像)的约束?
- c - 这个基于指针的代码的答案是什么,为什么?
- c# - Windows IoT 上的多线程导致线程关闭
- java - BroadcastReceiver 未在 Android 8.1+ 上捕获呼叫事件
- reactjs - 具有循环连接的层次树
- java - 如何在我的单元测试中使用 Mockito 或任何 Mocking 框架来模拟 Guice 注入?
- firebase - 如何使用firebase云功能pubsub.schedule?