在构建 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,您可以改用它。
我有一个包含 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,您可以改用它。