【问题标题】:How do I include "content" files in subdirectories in Windows 8.1 Phone?如何在 Windows 8.1 Phone 的子目录中包含“内容”文件?
【发布时间】:2015-02-21 23:18:17
【问题描述】:

我正在处理一个包含大量文件的项目(游戏)。这些文件可以从 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” 每个子目录。
  • 不必添加或删除艺术家添加到目录中的任何新文件。

【问题讨论】:

    标签: windows-phone-8 visual-studio-2013 msbuild windows-phone-8.1 appx


    【解决方案1】:

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

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

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

    相反,您可以自动将项目添加到项目文件中。 vcxproj 文件是一个 XML 文件 (scheme here),您可以编写脚本将资产文件添加到项目中的 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 项目外部拉入它们的能力。请参阅 App packages and deploymentApp package (MakeAppx.exe) 文档。

    【讨论】:

    • 感谢您的专家解答!如果您不介意的话,我确实还有一些其他问题... 1) 是否有我可以用来修改 vcxproj 的工具或插件?像 msbuild 或 visx 插件?或者我应该编写一个(.Net?)应用程序来在项目中插入文件节点? 2) 我确实有自定义文件(.pyro、.lua、.ogv)如果我将文件作为 DeploymentContent 插入,是否会保留路径? 3) 每次运行并且文件名发生更改时,我是否必须重新加载项目?
    • 我喜欢最后一个选项,因为它不会在我每次运行调试版本时更改我的 vcxproj。我已经使用批处理文件来创建 Windows Store 构建的分发包。它确实做到了:解压 AppX、复制游戏资源、创建 AppX、签名、测试安装。我将尝试使用 .bat 批处理文件在“构建后”步骤中自动执行此过程。我的第一个任务是找到创建 AppX 的目录。
    • 2) 的答案是“否”,因此无法使用该解决方案。正如我在第二条评论中所描述的,我已经使用“Windows Phone Application Deployment 8.1”工具上传了一个修改并重新打包的 AppX。唉,它也不能使用,我不能直接从 Visual Studio 运行它(在电话上调试)。 (这是我想念 XCode 的少数时刻之一。它有“通过引用添加目录”,它解决了这个问题……)
    【解决方案2】:

    解决方法是这样的:

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

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

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

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

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

    【讨论】:

    • 这是解决 Visual Studio 打包功能中的一个缺陷的一种非常老套的方法。我希望我可以与 Microsoft 员工取得联系以开始解决此问题。
    • 你联系微软成功了吗?我即将开始实施黑客攻击:D
    • 没有。一旦 WinRT 引擎实现稳定,我通过在 Win32 版本上进行日常工作来应对它。由于收入减少,我们很久以前就放弃了 Windows 应用商店。从那时起,我们还实现了 read-from-compiled-zip。复制一个大文件主要有助于我们的 Win32 安装程序和 Xcode 更快,但您也可以通过这种方式解决项目中的大量文件问题。
    【解决方案3】:

    如果人们对我用来解压/打包 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-29
      • 1970-01-01
      • 2015-06-25
      相关资源
      最近更新 更多