我有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也不工作的原因。
所以问题是,那么我应该如何 ?
答案 0 :(得分:1)
社区Zip任务非常老,不再适用于最新版本的MSBuild或跨平台dotnet
CLI。
但是,VS 2017 15.8和CLI 2.1.400引入了内置的ZipDirectory
task,您可以改用它。