Windows phone 8 如何在Windows 8.1 Phone的子目录中包含“内容”文件?

Windows phone 8 如何在Windows 8.1 Phone的子目录中包含“内容”文件?,windows-phone-8,visual-studio-2013,msbuild,windows-phone-8.1,appx,Windows Phone 8,Visual Studio 2013,Msbuild,Windows Phone 8.1,Appx,我在做一个项目,每个游戏都有很多文件。与2013年相比,这些文件可以从外部更改,例如由艺术家更改。这些文件位于子目录中,我们的游戏希望它们在那里。例如images/items/block.png 我尝试过使用生成后事件 xcopy /C /Y /I /R /S /Q "$(SolutionDir)game_data\*" "$(TargetDir)" 还有$LayoutDir。这个问题在我们的桌面Windows RT Store项目上没有出现,因为我只是将文件复制到构建的AppX目录,当我运行

我在做一个项目,每个游戏都有很多文件。与2013年相比,这些文件可以从外部更改,例如由艺术家更改。这些文件位于子目录中,我们的游戏希望它们在那里。例如images/items/block.png

我尝试过使用生成后事件

xcopy /C /Y /I /R /S /Q "$(SolutionDir)game_data\*" "$(TargetDir)"
还有$LayoutDir。这个问题在我们的桌面Windows RT Store项目上没有出现,因为我只是将文件复制到构建的AppX目录,当我运行时,exe会找到它们。但Windows Phone不再有AppX目录,也不会将其复制到手机上

如何将$SolutionDirgame_数据中的文件和目录包含到手机上安装的软件包中

最好是一种解决方案,其中:

不必在项目筛选器中重新创建整个子文件夹结构 不必在中每个文件的属性中指定Content=Yes 每个子目录。 不必添加或删除艺术家添加到目录中的任何新文件。
您需要尽早复制这些文件,以便将它们包含在Appx包中。您在桌面上复制到Appx目录post build的解决方案仅限于直接从自己的文件夹运行应用程序的生成计算机,而不是执行完整部署。由于这些文件不在部署包中,因此它们在其他系统上不可用。这在手机上更为明显,因为在运行应用程序之前,您始终需要部署应用程序,但最终还是一样的

手动方式是将文件包括在VisualStudio项目中。可以将文件复制到项目目录,显示所有文件,然后选择并包含新文件。如果它们没有自动添加为内容,那么大多数图像类型(如示例中的png)都会自动添加,那么您需要显式设置它们,以便在构建时将它们包含在appxpackage中

这就是你说你不想看到的情景

相反,您可以自动将项目添加到项目文件中。vcxproj文件是一个XML文件,您可以编写脚本将资产文件添加到项目中,并将其标记为DeploymentContent:

<ItemGroup>
    <Image Include="images\items\block.png" />
    <None Include="Assets\frotz.foo">
        <DeploymentContent>true</DeploymentContent>
    </None>
    <None Include="Assets\wibble.foo">
        <DeploymentContent>true</DeploymentContent>
    </None>
</ItemGroup>

最后,您可以使用makeappx.exe自己创建appxpackage,而不是让Visual Studio为您创建。这将使您能够完全控制包中的文件,包括从VS项目外部将它们拉入的能力。请参阅和文档。

如果人们对我用来解包/打包AppX的批处理文件感兴趣,请参阅以下文件:

@echo off

@REM ==================================
@REM User variables
@REM ==================================
set GAME_DIR=C:\development\MyAwesomeGame
set GAME_VERSION=1.0.0.0
set PVK_PUBLISHER=SECRETSECRETSECRETSECRETSECRET
@REM Uncomment for beta builds:
@REM set APPX_BUILD=_Beta
@REM Uncomment for debug builds:
@REM set APPX_BUILD=_Debug

set RESOURCETOOL_FLAVOR=compile_for_winrt
set GAME_NAME=Game.WindowsPhone
set GAME_TOOLS_DIR=%GAME_DIR%\tools
set GAME_DATA_DIR=%GAME_DIR%\data
set PFX_FILE=%GAME_DIR%\proj.win8.1\%GAME_NAME%_StoreKey.pfx
set RESOURCETOOL_OUTPUT=%GAME_DIR%\processed_game_data\win8.1
set MY_START_DIR=%cd%

@REM ==================================
@REM Tools
@REM ==================================
set WIN_SDK_BIN_DIR=C:\Program Files (x86)\Windows Kits\8.0\bin\x64
if not exist "%WIN_SDK_BIN_DIR%" set WIN_SDK_BIN_DIR=C:\Program Files\Windows Kits\8.0\bin\x86
set WINRAR_EXE=%GAME_TOOLS_DIR%\WinRAR.exe
set MAKECERT_EXE=%WIN_SDK_BIN_DIR%\makecert.exe
set MAKEAPPX_EXE=%WIN_SDK_BIN_DIR%\makeappx.exe
set SIGNTOOL_EXE=%WIN_SDK_BIN_DIR%\signtool.exe
set POWERSHELL_EXE=%SYSTEMROOT%\system32\WindowsPowerShell\v1.0\powershell.exe
set PVK_FILE=None
set CER_FILE=None

@REM ==================================
@REM Prerequisites check
@REM ==================================
if not exist "%MAKECERT_EXE%" goto err_no_MAKECERT_EXE
if not exist "%MAKEAPPX_EXE%" goto err_no_MAKEAPPX_EXE
if not exist "%SIGNTOOL_EXE%" goto err_no_SIGNTOOL_EXE
if not exist "%WINRAR_EXE%" goto err_no_WINRAR_EXE
if not exist "%POWERSHELL_EXE%" goto err_no_POWERSHELL_EXE

@REM ==================================
@REM Build options
@REM ==================================
set do_verbose=n
set do_all=y
set build_arm_platform=y
set build_win32_platform=y
set do_delete_tmp_dir=y
set do_copy_resources=y
set do_unpack_source_appx=y
set do_create_appx=y
set do_sign_appx=y
set do_install_appx=y
set do_create_rar=y

set /p do_all=Complete process? (default on) [y/n]: 
if not "%do_all%"=="n" goto skip_do_all
set /p build_arm_platform=Build ARM? (default on) [y/n]: 
set /p build_win32_platform=Build Win32? (default on) [y/n]: 
set /p do_verbose=Verbose output? (default off) [y/n]: 
set /p do_delete_tmp_dir=Delete TMP dir? (default on [y/n]): 
set /p do_copy_resources=Copy resources? (default on [y/n]): 
set /p do_unpack_source_appx=Unpack AppX? (default on) [y/n]: 
set /p do_create_appx=Create AppX? (default on) [y/n]: 
set /p do_sign_appx=Sign AppX? (default on) [y/n]: 
set /p do_install_appx=Install AppX? (default off) [y/n]: 
set /p do_create_rar=Create Rar? (default on) [y/n]: 
:skip_do_all

@REM ==================================
@REM Build verbosity settings
@REM ==================================
set XCOPY_VERBOSE=/q
if not "%do_verbose%"=="y" goto :skip_do_verbose
@echo on
set MAKEAPPX_VERBOSE=/v
set XCOPY_VERBOSE=
:skip_do_verbose

@REM ==================================
@REM Select current platform
@REM ==================================

if "%build_arm_platform%"=="n" goto end_arm_build
set WIN8_PLATFORM=ARM
goto run_appx_build
:end_arm_build

if "%build_win32_platform%"=="n" goto end_win32_build
set WIN8_PLATFORM=Win32
goto run_appx_build
:end_win32_build

cd "%MY_START_DIR%"

@echo ######## Done. ########
goto end

@REM ==================================
@REM Start platform dependent build here
@REM ==================================
:run_appx_build

@REM ==================================
@REM Platform AppX variables
@REM ==================================
set APPX_NAME=%GAME_NAME%_%GAME_VERSION%_%WIN8_PLATFORM%%APPX_BUILD%
set APPX_DIR=%GAME_DIR%\AppPackages\%GAME_NAME%\%APPX_NAME%_Test
set APPX_SOURCE_PATH=%APPX_DIR%\%APPX_NAME%.appx
set APPX_TEMP_DIR=%APPX_DIR%\_TMP_TMP_TMP_

@REM ==================================
@REM Remove temp dir
@REM ==================================
if "%do_unpack_source_appx%"=="n" if "%do_copy_resources%"=="n" if "%do_create_appx%"=="n" goto skip_temp_dir
if "%do_delete_tmp_dir%"=="n" goto skip_delete_temp_dir
@echo ######## Removing temporary directory ########
if exist "%APPX_TEMP_DIR%" call rmdir /S /Q "%APPX_TEMP_DIR%"
if exist "%APPX_TEMP_DIR%" goto err_APPX_TEMP_EXISTS
:skip_delete_temp_dir
mkdir "%APPX_TEMP_DIR%"
cd "%APPX_TEMP_DIR%"
:skip_temp_dir

@REM ==================================
@REM Unpack source AppX
@REM ==================================
if "%do_unpack_source_appx%"=="n" goto skip_unpack_source_appx
if not exist "%APPX_SOURCE_PATH%" goto err_no_APPX_SOURCE_PATH
@echo ######## Unpacking source AppX ########
"%WINRAR_EXE%" x "%APPX_SOURCE_PATH%"
:skip_unpack_source_appx

@REM ==================================
@REM Copy game resources
@REM ==================================
if "%do_copy_resources%"=="n" goto skip_copy_resources
if not exist "%RESOURCETOOL_OUTPUT%" goto err_no_RESOURCETOOL_OUTPUT
echo ######## Copying game's resources ########
xcopy /C /Y /I /R /S %XCOPY_VERBOSE% "%RESOURCETOOL_OUTPUT%\*" "%APPX_TEMP_DIR%\*"
xcopy /C /Y /I /R /S %XCOPY_VERBOSE% "%GAME_DATA_DIR%\shaders\*.cso" "%APPX_TEMP_DIR%\shaders"
:skip_copy_resources

@REM ==================================
@REM Create AppX
@REM ==================================
if "%do_create_appx%"=="n" goto skip_create_appx
@echo ######## Packaging new AppX ########
if exist "%APPX_SOURCE_PATH%" del "%APPX_SOURCE_PATH%"
if exist "%APPX_SOURCE_PATH%" goto err_cant_delete_APPX_SOURCE_PATH
call "%MAKEAPPX_EXE%" pack /l /o %MAKEAPPX_VERBOSE% /d "%APPX_TEMP_DIR%" /p "%APPX_SOURCE_PATH%" > NUL
:skip_create_appx

@REM ==================================
@REM Check if AppX creation was succesfull
@REM ==================================
if "%do_create_appx%"=="n" if "%do_sign_appx%"=="n" if not "%do_install_appx%"=="y" goto skip_check_appx_created
if not exist "%APPX_SOURCE_PATH%" goto err_no_APPX_SOURCE_PATH
:skip_check_appx_created

@REM ==================================
@REM Sign AppX
@REM ==================================
if "%do_sign_appx%"=="n" goto skip_sign_appx
@echo ######## Signing AppX file ########
if not exist "%PFX_FILE%" goto err_no_PFX_FILE
"%SIGNTOOL_EXE%" sign /a /v /fd sha256 /f "%PFX_FILE%" "%APPX_SOURCE_PATH%"
:skip_sign_appx

@REM ==================================
@REM Check for install script
@REM ==================================
if not "%do_install_appx%"=="y" if "%do_create_rar%"=="n" goto skip_install_script_check
set APPX_INSTALLSCRIPT=%APPX_DIR%\Add-AppDevPackage.ps1
set APPX_CERTIFICATE=%APPX_DIR%\%APPX_NAME%.cer
if not exist "%APPX_INSTALLSCRIPT%" goto err_no_APPX_INSTALLSCRIPT
if not exist "%APPX_CERTIFICATE%" goto err_no_APPX_CERTIFICATE
:skip_install_script_check

@REM ==================================
@REM Install AppX
@REM ==================================
if not "%WIN8_PLATFORM%"=="Win32" goto skip_install_appx
if not "%do_install_appx%"=="y" goto skip_install_appx
@echo ######## Installing AppX file ########
"%POWERSHELL_EXE%" "%APPX_INSTALLSCRIPT%"
:skip_install_appx

@REM ==================================
@REM Create rar to distribute
@REM ==================================
if "%do_create_rar%"=="n" goto skip_create_rar
cd %APPX_DIR%
call "%WINRAR_EXE%" a "%GAME_DIR%\%APPX_NAME%.rar" "Add-AppDevPackage.resources" "Dependencies" "Add-AppDevPackage.ps1" "%APPX_NAME%.appx" "%APPX_NAME%.appxsym" "%APPX_NAME%.cer"
:skip_create_rar

@REM ==================================
@REM Loop other platforms
@REM ==================================
if "%WIN8_PLATFORM%"=="ARM" goto end_arm_build
if "%WIN8_PLATFORM%"=="Win32" goto end_win32_build

@REM =================================
@REM Error messages
@REM ==================================

:err_APPX_TEMP_EXISTS
@echo The temporary directory already exists and cannot be removed:
@echo     %APPX_TEMP_DIR%
goto end

:err_no_MAKECERT_EXE
@echo Missing %MAKECERT_EXE%
goto end

:err_no_MAKEAPPX_EXE
@echo Missing %MAKEAPPX_EXE%
goto end

:err_no_SIGNTOOL_EXE
@echo Missing %SIGNTOOL_EXE%
goto end

:err_no_WINRAR_EXE
@echo Missing %WINRAR_EXE%
goto end

:err_no_POWERSHELL_EXE
@echo Missing %POWERSHELL_EXE%
goto end

:err_no_RESOURCETOOL_OUTPUT
@echo Missing %RESOURCETOOL_OUTPUT%
goto end

:err_no_APPX_SOURCE_PATH
@echo Missing %APPX_SOURCE_PATH%
goto end

:err_no_PFX_FILE
@echo Missing %PFX_FILE%
goto end

:err_no_APPX_INSTALLSCRIPT
@echo Missing %APPX_INSTALLSCRIPT%
goto end

err_no_APPX_CERTIFICATE
@echo Missing %APPX_CERTIFICATE%
goto end

:err_cant_delete_APPX_SOURCE_PATH
@echo Can't delete %APPX_SOURCE_PATH%
goto end

:end
pause

解决方法如下:

编写一个重命名整个目录结构的工具,如下所示:

script/game/level.lua变为scriptgamelevel.lua

然后将现在根目录中的所有文件添加到项目中,并将其属性内容设置为“是”

更改游戏中的路径,将“/”替换为。我希望您已经像我们一样将所有fopen调用转发到特定于平台的实现


您可以编写一个添加新文件的脚本,但现在,每次在SVN更新添加新文件后都可以轻松地完成此操作。

感谢您的专家解答!如果你不介意的话,我还有一些问题要问。。。1是否有工具或插件可用于修改vcxproj?像msbuild还是visx插件?还是我应该编写一个.Net?在项目中插入文件节点的应用程序?2我有自定义文件.pyro、.lua、.ogv如果我将这些文件作为DeploymentContent插入,路径会保留吗?3每次运行并且文件名发生更改时,我是否必须重新加载项目?我喜欢最后一个选项,因为它不会在每次运行调试生成时更改我的vcxproj。我已经用批处理文件创建了Windows应用商店版本的分发包。它做到了:解包AppX,复制游戏资产,创建AppX,签名,测试安装。我将尝试使用.bat批处理文件在后期构建步骤中自动化此过程。我的第一个任务是找到创建AppX的目录。2的答案是否,因此无法使用该解决方案。如我在第二条评论中所述,我已使用Windows Phone Application Deployment 8.1工具上传了一个经过修改和重新打包的AppX。唉,它也不能使用,我不能在电话上直接从VisualStudio调试运行它。这是我为数不多的怀念XCode的时刻之一。它通过引用添加目录,很好地解决了这个问题……这是一种非常有技巧的方法来解决VisualStudio打包功能中的一个缺点。我希望我能与Microsoft的员工取得联系,开始修复此问题。您成功联系Microsoft了吗?我即将开始执行hack:DNo。一旦WinRT引擎实现稳定,我就在Win32版本上做日常工作来应对它。由于收入减少,我们很久以前就放弃了Windows应用商店。从那时起,我们还实现了从编译的zip读取。复制一个大文件主要是有帮助的 我们的Win32安装程序和Xcode会更快,但您也可以通过这种方式解决项目中的大量文件问题。