4

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

我尝试过使用构建后事件

xcopy /C /Y /I /R /S /Q "$(SolutionDir)game_data\*" "$(TargetDir)"

还有 $(LayoutDir)。我们的桌面(Windows RT 商店)项目不会出现此问题,因为我只是将文件复制到构建的 AppX 目录,当我运行时,exe 会找到它们。但是对于 Windows Phone,不再有 AppX 目录,并且它不会将其复制到手机。

如何将 $(SolutionDir)game_data 中的文件和目录包含到手机上安装的包中?

最好是我的解决方案:

  • 不必在项目过滤器中重新创建整个子文件夹结构
  • 不必在每个子目录中的每个文件的属性中指定“Content=Yes”。
  • 不必添加或删除艺术家添加到目录中的任何新文件。
4

3 回答 3

3

您需要尽早复制这些文件,以便将它们包含在 Appx 包中。您在桌面上构建后复制到 Appx 目录的解决方案仅限于构建机器,该机器直接从自己的文件夹中运行应用程序,而不是进行完整部署。由于这些文件不在部署包中,因此它们在其他系统上不可用。这在手机上更为明显,因为您总是需要在运行应用程序之前部署应用程序,但最终都是一样的。

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

这几乎是你说你不想要的场景。

相反,您可以自动将项目添加到项目文件中。vcxproj 文件是一个 XML 文件(此处为方案),您可以编写脚本将资产文件添加到项目中的ItemGroups并将它们标记为 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 项目外部拉入它们的能力。请参阅应用程序包和部署以及应用程序包 (MakeAppx.exe)文档。

于 2015-02-20T00:18:26.120 回答
2

解决这个问题的方法是这样的:

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

    script/game/level.lua变成script#game#level.lua

  • 然后将所有文件(现在位于根目录中)添加到您的项目中并设置它们的属性 Content=Yes

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

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

于 2015-02-21T15:18:17.010 回答
1

如果人们对我用来解压/打包 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
于 2015-02-20T15:42:04.203 回答