创建一个NuGet包,用于更新MSBUILD进程以在构建目标之前运行程序

问题描述 投票:0回答:1

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

我的NuGet包有一个包含CreateCompilationTimeFile.exe的Tools文件夹和一个包含{packagename} .props文件的Build文件夹。

我已经尝试了很多组合来在{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包而不是属性表来做。

我究竟做错了什么?谢谢。

visual-studio msbuild nuget nuget-package pre-build-event
1个回答
0
投票

正如@ 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 ++项目,并在其中一个.cpp文件中包含compilationtime.h文件:

#include "compilationtime.h"

请记住,该项目是新的,您没有任何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文件,它将使用当前年份进行修改,因此编译器的行为就好像我们已经配置了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文件。

© www.soinside.com 2019 - 2024. All rights reserved.