Как развернуть Контент, созданный в пакете 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.