Как развернуть Контент, созданный в пакете Target to AppX, в приложении UWP с помощью MSBuild

У меня есть проект CW XAML UWP, созданный в Visual Studio 2017, и у меня есть некоторые ресурсы, которые я хочу преобразовать и развернуть в пакете AppX. Однако я не могу развернуть мои преобразованные ресурсы, не добавив их непосредственно в AppXPackagePayload.

Я создал упрощенный контрольный пример с ванильным приложением C# XAML и парой текстовых файлов в папке RawData. Я хочу, чтобы текстовые файлы были конвертированы (пока скопированы) и развернуты в папке Data в моем AppX.

Я добавил следующее в мой csproj прямо перед импортом Xaml.CSharp.targets (я добавил тип элемента ConvertedData только для отладки):

<ItemGroup>
    <RawData Include="RawData\**\*.*" />
</ItemGroup>
<Target Name="ConvertData" BeforeTargets="Compile" Inputs="@(RawData)" Outputs="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)">
  <ItemGroup>
    <ConvertedData Include="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
    <Content Include="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
  </ItemGroup>
  <Message Importance="high" Text="Creating Data: @(RawData) -> Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
  <Copy SourceFiles="%(RawData.Identity)" DestinationFiles="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
</Target>
<Target Name="DisplayContent" AfterTargets="ConvertData" BeforeTargets="Compile">
  <Message Importance="high" Text="RawData: @(RawData)" />
  <Message Importance="high" Text="ConvertedData: @(ConvertedData)" />
  <Message Importance="high" Text="Content: @(Content)" />
</Target>

Выходные данные журнала при сборке:

1>  Creating Data: RawData\Hello.txt -> Data\Hello.txt
1>  Creating Data: RawData\World.txt -> Data\World.txt
1>  RawData: RawData\Hello.txt;RawData\World.txt
1>  ConvertedData: Data\Hello.txt;Data\World.txt
1>  Content: Properties\Default.rd.xml;Assets\LockScreenLogo.scale-200.png;Assets\SplashScreen.scale-200.png;Assets\Square150x150Logo.scale-200.png;Assets\Square44x44Logo.scale-200.png;Assets\Square44x44Logo.targetsize-24_altform-unplated.png;Assets\StoreLogo.png;Assets\Wide310x150Logo.scale-200.png;Data\Hello.txt;Data\World.txt

Что, как и ожидалось. Теперь у меня есть папка Data в папке моего проекта, содержащая мои "преобразованные" текстовые файлы. Однако файлы в папке " Данные " никогда не попадают в папку AppX при развертывании приложения, даже если они указаны как "Содержимое". Все остальные активы, которые не были созданы в Target, будут развернуты. Кажется, что элементы контента, созданные в Target, не добавляются в AppXPackagePayload.

Если я добавлю следующее в ItemGroup цели:

<AppxPackagePayload Include="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)">
  <TargetPath>Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)</TargetPath>
</AppxPackagePayload>

Затем элементы в папке "Данные" будут развернуты в AppX. Тем не менее, я чувствую, что простого добавления моих элементов в Content в Target должно быть достаточно для их развертывания. Я делаю что-то неправильно?

Спасибо!

2 ответа

Решение

Обработка элементов контента происходит до компиляции, поэтому вы должны заменить

BeforeTargets="Compile"

с

BeforeTargets="AssignTargetPaths"

Это должно делать свое дело.

Теперь у меня есть работающее решение, которое позволяет избежать элементов содержимого, сгенерированных Target, а также явного AppXPackagePayload. Это работает, потому что у меня есть взаимно-однозначное сопоставление между моими файлами RawData и Data, поэтому я могу поместить все элементы контента за пределы цели. Он не отвечает, почему сгенерированные Target элементы Content не развертываются (и я все еще хотел бы знать, почему это так, если кто-то знает), но он решает мою проблему чисто, поэтому может быть полезен для других:

<ItemGroup>
    <RawData Include="RawData\**\*.*">
      <Visible>True</Visible>
    </RawData>
</ItemGroup>
<ItemGroup>
    <Content Include="@(RawData-> 'Data\%(RecursiveDir)%(Filename)%(Extension)')">
      <Visible>True</Visible>
    </Content>
</ItemGroup>
<Target Name="ConvertData" BeforeTargets="Compile" Inputs="@(RawData)" Outputs="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)">
  <Copy SourceFiles="%(RawData.Identity)" DestinationFiles="Data\%(RawData.RecursiveDir)%(RawData.Filename)%(RawData.Extension)" />
</Target>

Теперь мои файлы данных созданы в папке моего проекта и правильно развернуты в папке AppX.

Другие вопросы по тегам