【问题标题】:Creating a NuGet Package that updates the MSBUILD process to run a program before the build target创建更新 MSBUILD 进程以在构建目标之前运行程序的 NuGet 包
【发布时间】:2019-02-16 19:37:56
【问题描述】:

我正在尝试创建一个在构建之前运行外部应用程序的 NuGet 包。该应用程序会创建一个 compilationtime.h 文件以了解编译时间并在 About 对话框中显示它。

我的 NuGet 包有一个带有 CreateCompilationTimeFile.exeTools 文件夹和一个带有 {packagename}.propsBuild 文件夹/em> 文件。

我尝试了很多组合来在 {packagename}.props 文件中创建 Pre-Build 事件,但它们都不起作用。

我试过这个:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ItemDefinitionGroup>
    <PreBuildEvent>
      <Command>"$(MSBuildThisFileDirectory)..\tools\CreateCompilationTimeFile.exe"</Command>
    </PreBuildEvent>
  </ItemDefinitionGroup>
</Project>

还有这个:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="BeforeBuild2" BeforeTargets="Build">
      <Exec Command="$(MSBuildThisFileDirectory)..\tools\CreateCompilationTimeFile.exe"/>
  </Target>
</Project>

如果我在没有 NuGet 包的情况下执行此操作并使用下一个属性表执行此操作,则它可以正常工作:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <ImportGroup Label="PropertySheets" />
  <PropertyGroup Label="UserMacros" />
  <PropertyGroup />
  <ItemDefinitionGroup>
    <PreBuildEvent>
      <Command>"$(SolutionDir)Tools\CreateCompilationTimeFile.exe"</Command>
    </PreBuildEvent>
  </ItemDefinitionGroup>
  <ItemGroup />
</Project>

但我想使用 NuGet 包而不是属性表。

我做错了什么? 谢谢。

【问题讨论】:

  • 您的第二种方法&lt;Target Name="BeforeBuild2" BeforeTargets="Build"&gt; 应该可以工作,为什么它不适合您?你对这个方法有什么错误吗?
  • 不,我没有任何错误,但预构建事件永远不会运行,并且文件“compilationtime.h”永远不会创建。
  • 预构建事件永远不会运行,你让我感到困惑。如果您使用第二种方法,则没有任何预构建事件,它被目标&lt;Target Name="BeforeBuild2" BeforeTargets="Build"&gt; 替换,对吗?当您构建项目时,VS/MSBuild 将在构建之前执行此目标,将执行 CreateCompilationTimeFile.exe 并生成文件“compilationtime.h”。我有什么误解吗?
  • 或者在 NuGet 包中创建 Pre-Build 事件是您的目标,而不是在构建之前创建运行外部应用程序的 NuGet 包?
  • 第二种方法实际上没有“预构建事件”,确实程序应该被执行,但它没有被执行。很抱歉造成误会。

标签: visual-studio msbuild nuget nuget-package pre-build-event


【解决方案1】:

正如@leo-liu-msft 所说,第二个解决方案有效,但没有按预期工作,我将在下面解释。

如果 {packagename}.props 包含以下内容:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="CreateCompilationFileTimeTarget" BeforeTargets="Build">
      <Exec Command="$(MSBuildThisFileDirectory)..\tools\CreateCompilationTimeFile.exe"/>
  </Target>
</Project>

假设您刚刚创建了一个全新的 C++ 项目并将 compilationtime.h 文件包含在一个 .cpp 文件中:

#include "compilationtime.h"

请记住,该项目是新建,并且您没有任何 compilationtime.h 文件 jet,它应该是 之前创建的由于 {packagename}.props 的构建过程。

如果您构建您的 C++ 项目,您将收到 C0183 Cannot open include file: 'CompilationTime.h': No such file or directory 错误。

如果你打开项目文件夹,compilationtime.h 文件不在它应该在的位置。

现在注释#include "compilationfile.h" 行并再次编译它。编译器将在没有任何错误的情况下完成,如果您分析文件夹,文件就会在那里!

现在您的 compilationfile.h 已经存在,编辑它并将 tm_year 更改为 0 例如:

#pragma once
static struct tm GetCompilationTime()
{
    struct tm compilationTime = { 0 };
    compilationTime.tm_year=0;
    compilationTime.tm_mon=9;
    compilationTime.tm_mday=15;
    compilationTime.tm_hour=15;
    compilationTime.tm_min=37;
    compilationTime.tm_sec=41;
    return compilationTime;
}

..然后在您的 .cpp 文件中,将年份打印到控制台:

#include "pch.h"
#include <iostream>

#include "CompilationTime.h"

int main()
{
    std::cout << GetCompilationTime().tm_year << std::endl;
}

编译并运行程序。程序将打印 0 而不是当前年份,但是如果您打开 compilationtime.h 文件,它会被修改为当前年份,因此编译器的行为就像而不是BeforeTargets="Build",我们配置了AfterTargets="Build"

最后我解决了将 BeforeTargets 更改为 PrepareForBuild 的问题,如下所示:

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="CreateCompilationFileTimeTarget" BeforeTargets="PrepareForBuild">
        <Exec Command="$(MSBuildThisFileDirectory)..\tools\CreateCompilationTimeFile.exe"/>
    </Target>
</Project>

现在它总是在我想要的构建之前创建/更新 compilationtime.h 文件。

【讨论】:

    猜你喜欢
    • 2021-11-07
    • 2023-03-06
    • 2021-09-30
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2018-11-15
    相关资源
    最近更新 更多