创建一个 NuGet 包,将 MSBUILD 进程更新为构建目标之前的 运行 个程序
Creating a NuGet Package that updates the MSBUILD process to run a program before the build target
我正在尝试创建一个 NuGet 包,它在构建之前运行一个外部应用程序。该应用程序创建一个 compilationtime.h 文件以了解编译时间,以便在 关于 对话框中显示它。
我的 NuGet 包有一个 Tools 文件夹,其中包含 CreateCompilationTimeFile.exe 和一个 Build 包含 {packagename}.props 文件的文件夹。
我尝试了很多组合来在 {packagename}.props 文件中创建 Pre-Build 事件,但其中 none 有效。
我试过这个:
<?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 包的情况下执行此操作并使用下一个 属性 sheet,它可以正常工作:
<?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 包而不是 属性 sheets.
我做错了什么?
谢谢
正如@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"
请记住,该项目是 new 并且您没有任何 compilationtime.h 文件 jet,它应该由于 {packagename}.props. 在 构建过程之前被创建。
如果您构建 C++ 项目,您将收到 C0183 无法打开包含文件:'CompilationTime.h':没有这样的文件或目录 错误。
如果你打开项目文件夹,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 文件,它会被修改为当前年份,因此编译器的行为就好像我们配置的 AfterTargets="Build"
.
而不是 BeforeTargets="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>
现在它 creates/updates compilationtime.h 文件总是在我想要的构建之前。
我正在尝试创建一个 NuGet 包,它在构建之前运行一个外部应用程序。该应用程序创建一个 compilationtime.h 文件以了解编译时间,以便在 关于 对话框中显示它。
我的 NuGet 包有一个 Tools 文件夹,其中包含 CreateCompilationTimeFile.exe 和一个 Build 包含 {packagename}.props 文件的文件夹。
我尝试了很多组合来在 {packagename}.props 文件中创建 Pre-Build 事件,但其中 none 有效。
我试过这个:
<?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 包的情况下执行此操作并使用下一个 属性 sheet,它可以正常工作:
<?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 包而不是 属性 sheets.
我做错了什么? 谢谢
正如@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"
请记住,该项目是 new 并且您没有任何 compilationtime.h 文件 jet,它应该由于 {packagename}.props. 在 构建过程之前被创建。
如果您构建 C++ 项目,您将收到 C0183 无法打开包含文件:'CompilationTime.h':没有这样的文件或目录 错误。
如果你打开项目文件夹,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 文件,它会被修改为当前年份,因此编译器的行为就好像我们配置的 AfterTargets="Build"
.
BeforeTargets="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>
现在它 creates/updates compilationtime.h 文件总是在我想要的构建之前。