Вывод элементов из пользовательской цели msbuild - PullRequest
0 голосов
/ 17 октября 2018

Потратив целый день на изучение MsBuild: файлы проектов, элементы, свойства, цели и задачи, я все еще не могу найти решение своей проблемы.

Я стремлюсь создать собственную цель в моем .csproj длягенерировать двоичные файлы из входных текстовых файлов с помощью консольной программы.Цель делает то, что должна делать.Но я хочу, чтобы сгенерированные файлы были частью файла проекта как Контент, который должен быть скопирован (опубликован) вместе с приложением.

Я получил следующий файл проекта:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup>
    <MyTool>.\tools\mytool.exe</MyTool>
  </PropertyGroup>

  <Target Name="MyTarget" DependsOnTargets="Restore" BeforeTargets="Build;Publish"
      Inputs="@(TxtFiles)"
      Outputs="@(TxtFiles->'%(RootDir)%(Directory)%(Filename).bin')">
    <Exec Command="$(MyTool) -o %(TxtFiles.RootDir)%(TxtFiles.Directory)%(TxtFiles.Filename).bin %(TxtFiles.Identity)"
      Outputs="@(TxtFiles->'%(RootDir)%(Directory)%(Filename).bin')">
      <Output TaskParameter="Outputs" ItemName="BinFiles" />
    </Exec>
  </Target>
  <ItemGroup>
    <TxtFiles Include="my_resources\*.txt" />
    <Content Include="@(TxtFiles)">
       <CopyToOutputDirectory>Never</CopyToOutputDirectory>
    </Content>
    <Content Include="@(BinFiles)">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <PublishState>Included</PublishState>
    </Content>
  </ItemGroup>
</Project>

К сожалению - это не заполняет элемент @(BinFiles).Если, если удалить это вручную (как если бы вы вызывали инструмент заранее), это работает:

<ItemGroup>
  <Content Include="my_resources\*.bin">
    <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    <PublishState>Included</PublishState>
  </Content>
</ItemGroup>

Я хочу добиться того же поведения.Кроме того, поскольку моя цель объявляет входы и выходы, как бы она заполнила свои выходы для добавления в качестве контента?

1 Ответ

0 голосов
/ 20 октября 2018

Наконец, другой вопрос имел подсказку в ответе .С его помощью удалось определить окончательный файл проекта, который работал как задумано.Я понял, что мне не нужны целевые выходы, а скорее добавлю их в элемент содержимого.

Я получил следующее:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <TargetFrameworks>netstandard2.0</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup>
    <MyTool>.\tools\mytool.exe</MyTool>
  </PropertyGroup>

  <ItemGroup>
    <Content Include="my_resources\**\*.txt">
      <CopyToOutputDirectory>Never</CopyToOutputDirectory>
    </Content>
  </ItemGroup>

  <Target Name="MyTarget" DependsOnTargets="Restore" BeforeTargets="BeforeBuild;PrepareForPublish">
    <ItemGroup>
      <TxtFiles Include="@(Content)" Condition="'%(Extension)' == '.txt'" />
    </ItemGroup>
    <Exec Command="$(MyTool) -o $([System.IO.Path]::ChangeExtension('%(TxtFiles.Fullpath)','.bin')) %(TxtFiles.Identity)"
       Outputs="$([System.IO.Path]::ChangeExtension('%(TxtFiles.Fullpath)','.bin'))">
      <Output TaskParameter="Outputs" ItemName="_BinFiles" />
    </Exec>

    <ItemGroup>
      <Content Include="@(_BinFiles)">
        <CopyToOutputDirectory>Always</CopyToOutputDirectory>
        <PublishState>Included</PublishState>
      </Content>
      <BinFiles Include="@(Content)" Condition="'%(Extension)' == '.bin'" />
    </ItemGroup>
  </Target>
</Project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...