繁体   English   中英

通过API的NuGet和MSBuild-不执行目标文件

[英]NuGet & MSBuild via API - not executing targets file

<?xml version="1.0" encoding="utf-8" ?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="MainFrameworkRegenerateFeatures" BeforeTargets="BeforeBuild">
    <Message Importance="high" Text="Regenerating Feature Files" />
    <Exec Command="$(ProjectDir)..\packages\SpecFlow.3.0.1\tools\SpecFlow.exe generateAll $(ProjectPath) /force /verbose"
          Condition="Exists('$(ProjectDir)..\packages\SpecFlow.3.0.1\tools\SpecFlow.exe')" />
  </Target>
  <PropertyGroup>
    <BuildDependsOn>
      $(BuildDependsOn);
      MainFrameworkRegenerateFeatures;
    </BuildDependsOn>
  </PropertyGroup>
</Project>

我有上述目标文件,该文件被捆绑到nuget软件包的build目录中。 安装该软件包后,我可以看到它在csproj中进行了适当的输入。 注意-上面的目标文件在尝试调试时采取了多种形式。 我最初没有属性组就拥有它,但是在听说此方法可能可以解决其他问题等之后,将属性组放进去。

<Target Name="EnsureNuGetPackageBuildImports" BeforeTargets="PrepareForBuild">
    <PropertyGroup>
      <ErrorText>This project references NuGet package(s) that are missing on this computer. Enable NuGet Package Restore to download them.  For more information, see http://go.microsoft.com/fwlink/?LinkID=322105. The missing file is {0}.</ErrorText>
    </PropertyGroup>
    <Error Condition="!Exists('$(SolutionDir)\.nuget\NuGet.targets')" Text="$([System.String]::Format('$(ErrorText)', '$(SolutionDir)\.nuget\NuGet.targets'))" />
    <Error Condition="!Exists('..\packages\MainFramework.0.15.0\build\MainFramework.targets')" Text="$([System.String]::Format('$(ErrorText)', '..\packages\MainFramework.0.15.0\build\MainFramework.targets'))" />
  </Target>
  <PropertyGroup>
    <PreBuildEvent>
    </PreBuildEvent>
  </PropertyGroup>
  <Import Project="..\packages\MainFramework.0.15.0\build\MainFramework.targets" Condition="Exists('..\packages\MainFramework.0.15.0\build\MainFramework.targets')" />

因此,这是nuget.exe将程序包安装到csproj中时的默认安装。

当我通过Visual Studio运行构建时,目标会正确触发。 我看到输出说“重新生成功能文件”,然后它告诉我要重新生成哪些功能文件。

但是,当我通过使用MSBuild API开发的自定义生成工具进行生成时,它会完全跳过MainFrameworkRegenerateFeatures。

我的构建工具通过以下方式完成构建:

                ProjectCollection pc = new ProjectCollection();
                Dictionary<string, string> globalProperty = new Dictionary<string, string>();
                globalProperty.Add("nodeReuse", "false");
                BuildParameters bp = new BuildParameters(pc);
                bp.Loggers = new List<Microsoft.Build.Framework.ILogger>()
                {
                    new FileLogger() {Parameters = @"logfile=buildresult.txt", Verbosity = LoggerVerbosity.Diagnostic}
                };
                BuildRequestData buildRequest = new BuildRequestData(projectFilePath, globalProperty, "12.0",
                    new string[] { "Clean", "Build" }, null);
                BuildResult buildResult = BuildManager.DefaultBuildManager.Build(bp, buildRequest);
                BuildManager.DefaultBuildManager.Dispose();

                pc = null;
                bp = null;
                buildRequest = null;

构建成功,但是它从不执行目标文件-不会重新生成任何功能文件。

我有一个非常冗长的日志文件,告诉我以下内容:

文件“ C:\\ ETRBuilder \\ BuildRunner \\ ETRun_9302082.1742918 \\ CP.SolutionDir \\ CP.ProjectDir \\ IE.Project.csproj”中的目标“ EnsureNuGetPackageBuildImports”:由于条件错误,跳过了“错误”任务; (!Exists('$(SolutionDir).nuget \\ NuGet.targets'))的评估为(!Exists('C:\\ ETRBuilder \\ BuildRunner \\ ETRun_9302082.1742918 \\ CP.SolutionDir \\ .nuget \\ NuGet.targets')) 。 由于错误条件,任务“错误”被跳过; (!Exists('.. \\ packages \\ MainFramework.0.15.0 \\ build \\ MainFramework.targets'))的评估为(!Exists('.. \\ packages \\ MainFramework.0.15.0 \\ build \\ MainFramework.targets') )。 项目“ IE.Project.csproj”中的构建目标“ EnsureNuGetPackageBuildImports”已完成。

为什么这可以在Visual Studio中工作,但在MSBuild中失败?

关于如何解决这个问题的任何想法?

编辑1:当手动对解决方案文件运行MSBuild.exe时,它会执行目标并将要素文件重新生成为测试类。 似乎只有通过特定API才能通过API完成此操作。

GenerateTargetFrameworkMonikerAttribute:跳过目标“ GenerateTargetFrameworkMonikerAttribute”,因为所有输出文件都相对于输入文件而言是最新的。 MainFrameworkRegenerateFeatures:重新生成特征文件
C:\\ ETRBuilder \\ BuildRunner \\ ETRun_9372271.4822016 \\ ClientName \\ ProjectFolder .. \\ packages \\ SpecFlow.2.0.1 \\ tools \\ SpecFlow.exe generateAll C:\\ ETRBuilder \\ BuildRunner \\ ETRun_9372271.4822016 \\ ClientName \\ ProjectFolder \\ Client.csproj /强制/详细处理项目:ClientProject等...
功能\\旧版\\ SmokeTest \\ Core \\ Core.feature->测试已更新

我将尝试从API调用中取出MSBuild版本属性,以防引起它。

我尝试了这种方法,但是通过Service应用程序执行时,它仍然会跳过目标! 但是,如果我自己通过命令行手动执行它-它可以正常工作并重新生成功能文件... WTF正在进行吗?

public static bool BuildWithMSBuild(string solution)
        {
            string command = solution;
            ProcessStartInfo psi = new ProcessStartInfo(PathToMSBuild());
            psi.Arguments = command;
            psi.UseShellExecute = false;
            psi.RedirectStandardOutput = true;
            Process p = new Process();
            p.StartInfo = psi;
            p.Start();
            var v = p.StandardOutput.ReadToEnd();
            Console.Write(v);
            p.WaitForExit(60000);
            File.WriteAllText("buildresult.txt",v);
            if (v.Contains("Build succeeded"))
            {
                return true;
            }
            return false;
        }

现在,当通过Windows服务执行时,我无法使它正常工作。 它总是跳过自定义目标。

我必须通过Specflow.exe上的Process.Start将“重新生成”步骤集成到我的构建任务中。

您是否也在以编程方式进行nuget恢复?

由于它看起来像评估为false:

Exists('$(SolutionDir).nuget\NuGet.targets')

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM