2017-12-27 168 views
0

我有一個在Visual Studio 2017中創建的C#XAML UWP項目,我有一些資源需要轉換並部署到AppX包中。但是,我無法直接將其轉換資產部署到AppXPackagePayload中。如何將目標中生成的內容部署到帶有MSBuild的UWP應用程序中的AppX包中

我已經在RawData文件夾中用香草C#XAML應用程序和幾個文本文件創建了一個簡化的測試用例。我希望將文本文件轉換(現在已複製)並部署到我的AppX中的Data文件夾。

我加了Xaml.CSharp.targets進口前右下面我的csproj(我說只是爲了調試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文件夾中。目標中未生成的所有其他資產都已部署。看起來好像在目標中創建的內容項不會被添加到AppXPackagePayload中。

如果我添加以下目標公司的ItemGroup:

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

然後在數據文件夾中的項目將部署到AppX中。但是,我覺得只需將我的項目添加到目標中的內容就足以實現部署。難道我做錯了什麼?

謝謝!

+0

您是否嘗試重新加載項目? –

+0

有很多次!實際上,在我上面概述的測試案例中,我直接編輯了csproj文件,因此Visual Studio每次進行編輯時都會強制重新加載解決方案。我也嘗試重新啓動VS. –

+0

從Nico的評論開始,值得澄清的是,如果代碼位於外部的props文件中而不是直接在csproj中,則必須關閉並重新加載整個解決方案以查看VS中的任何更改。卸載並重新加載解決方案中的特定項目是不夠的。 –

回答

1

內容項目的處理在編譯之前發生的,所以你應該

BeforeTargets="AssignTargetPaths"

這應該做的伎倆取代

BeforeTargets="Compile"

+0

是的,那工作!事後看來,我應該意識到它只是在錯誤的時間運行。謝謝! –

+0

爲了防止某人有用,我將示例項目放在Github上:[https://github.com/jccaulfield/MSBuildTest](https://github.com/jccaulfield/MSBuildTest) –

0

我現在有一個工作解決方案,它可以避免目標生成的內容項以及明確的AppXPackagePayload。這是有效的,因爲我在我的RawDataData文件之間有一對一映射,所以我可以將所有內容項目放在目標之外。它並沒有回答爲什麼目標生成的內容項目沒有被部署(我仍然想知道爲什麼有人知道這就是這種情況),但它確實以一種乾淨的方式解決了我的問題,所以可能對其他人有用:現在

<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中的文件夾。

+0

這個答案實際上只是一種解決方法,可以避免這個問題,並可能對其他類似問題有幫助。我仍然希望有人能夠幫助解決潛在的問題,即爲什麼從目標發出的我的內容項目未被部署。 –

相關問題