【问题标题】:Programmatic project build fails due to third-party build task由于第三方构建任务,程序化项目构建失败
【发布时间】:2013-09-22 09:10:54
【问题描述】:

我已经设置了一个 Web 应用程序项目,其中包含一个额外的构建后步骤来压缩一些生成的文件以用于发布构建。为此,我添加了 MSBuild 社区任务 NuGet 包。当我在 Visual Studio 中构建时,这可以正常工作,并且我已经确认创建了 zip 文件。 csproj 文件的相关部分是:

<PropertyGroup>
    <MSBuildCommunityTasksPath>$(SolutionDir)\.build</MSBuildCommunityTasksPath>
    <ZipFile>$(SolutionName).zip</ZipFile>
</PropertyGroup>
<Import Project="$(MSBuildCommunityTasksPath)\MSBuild.Community.Tasks.targets" />

<Target Name="Zip" AfterTargets="Build" Condition="'$(Configuration)' == 'Release'">
    <ItemGroup>
        <ZipFiles Include="$(ProjectDir)\*.js; $(ProjectDir)\manifest.json" Exclude="$(ProjectDir)\*.map.js" />
    </ItemGroup>
    <Delete Files="$(ZipFile)" />
    <Zip Files="@(ZipFiles)" WorkingDirectory="$(ProjectDir)" ZipFileName="$(ZipFile)" ZipLevel="9" />
</Target>

我在另一个项目中有一些代码试图自动构建上述项目。代码如下:

var projectInstance = new ProjectInstance(project.File.AbsolutePath);
projectInstance.SetProperty("Configuration", "Release");
projectInstance.SetProperty("SolutionDir", project.Solution.Directory.AbsolutePath);

projectInstance.Build("Build", Enumerable.Empty<ILogger>());

上面的代码失败并显示以下错误消息:

找不到“Zip”任务。检查以下内容: 1.) 项目文件中的任务名称与任务类的名称相同。 2.) 任务类是“公共的”并实现了 Microsoft.Build.Framework.ITask 接口。 3.) 在项目文件或位于“C:\Windows\Microsoft.NET\Framework\v4.0.30319”目录下的 *.tasks 文件中正确声明了任务。

如果我删除 Zip 任务,它会完美运行。为什么当我以编程方式构建时会失败,但在 VS 中构建时不会?我该如何解决?

【问题讨论】:

  • 您是否在 Visual Studio 命令提示符下使用 msbuild 命令尝试过相同的操作。如果没有,您可以尝试一次并发布结果吗?
  • @RinoTom,我刚刚尝试过,它产生了相同的结果。它还包括一个错误号:error MSB4036.

标签: .net visual-studio visual-studio-2012 msbuild msbuildcommunitytasks


【解决方案1】:

如果您从 Visual Studio 的工具菜单 >> 选项 >> 包管理器 >> 常规中提供包还原选项,这将得到解决,如下图所示:

即使您使用 MSBuild 构建项目,这也会恢复 Nuget 包。否则,它将仅在 Visual Studio 版本中恢复,而不是在 MSBuild 版本中。因此,MSBuild.Community.Tasks Nuget 没有在 MSBuild 中为您恢复,但在 Visual Studio 中运行良好。

所以,试试这个,希望这能解决问题。

【讨论】:

  • 包没有丢失,所以我认为不需要恢复;它已经在文件系统中。 MSBuild 并不是说​​它找不到文件。
  • 您的意思是在尝试 Visual Studio 命令提示符 MSBuild 和\或程序化构建后,包文件存在于文件系统中吗?我知道即使没有我在回答中提到的设置,它也会在 Visual Studio 解决方案构建之后出现。
  • 没错;在更新项目文件之前,我已经从 NuGet 安装了包。我还没有从文件系统中删除它。
  • 即使包是从 Nuget 手动安装的,MSBuild 也会在每次构建期间尝试恢复包。如果未按照我在使用 Visual Studio 设置的回答中提到的那样设置 EnablePackageRestore 环境变量,则包还原将删除该包,并且它不会被还原,进而导致构建失败。
  • 我不确定它到底是如何工作的。不过,我所知道的是,它给出的错误与不存在的文件无关。如果路径不正确或文件不存在,似乎会产生一个错误来表明这一点。
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2022-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-22
  • 2020-02-14
相关资源
最近更新 更多