Создание пакета NuGet, который обновляет процесс MSBUILD для запуска программы перед целью сборки - PullRequest
0 голосов
/ 12 сентября 2018

Я пытаюсь создать пакет NuGet , который запускает внешнее приложение перед сборкой.Это приложение создает файл compilationtime.h , чтобы узнать время компиляции и показать его в диалоговом окне О .

В моем пакете NuGet есть ИнструментыПапка с CreateCompilationTimeFile.exe и папкой Build с файлом {packagename} .props .

Я пробовалмного комбинаций для создания события Pre-Build в файле {packagename} .props , но ни одна из них не работает.

Я пробовал с этим:

<?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, а не со списком свойств.

Что я делаю не так?Спасибо.

1 Ответ

0 голосов
/ 17 сентября 2018

Как говорит @ 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 файловой струи, предполагается, что он будет создан до процесса сборки из-за {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 всегда перед сборкой, как я хотел.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...