首页 > 其他分享 >UE4构建基础和实践:四、使用脚本打包

UE4构建基础和实践:四、使用脚本打包

时间:2023-07-24 12:22:50浏览次数:45  
标签:脚本 set cmd 构建 Build BuildGraph UE UE4 打包

序言

使用UE版本为UE5.20
在实际项目中,我们常常使用自动化脚本来进行构建,它可以增加我们的生产效率,并降低人为操作带来的失误风险。

BuildGraph

BuildGraph UE官方提供的构建脚本系统,它可以读取对应的XML脚本实现自动化打包。
BuildGraph相关的参考BuildGraph | UE文档
重点是它相关的语法

自动化脚本

自动化脚本我打算使用(.bat / .sh)“壳”文件作为入口,运行py脚本并拉起运行BuildGraph命令的UAT,并且设定相关的参数。

Build.bat

python3 Build.py

运行该目录的py脚本

Build.py

import sys
import os

def main(argv):
    ProjectName             = "BuildTest"
    ProjectDir              = r"E:/AllProject/UE_5_2_0/BuildTest/"
    Platform                = "Android"
    ClientConfig            = "Development"
    OutputDir               = r"E:/AllProject/UE_5_2_0/BuildTest/PakOutputX"
    SkipBuildProject        = "true"
    SkipBuildEditor         = "true"
    Unrealexe               = r"E:\UE\UE_4.27_Source\UnrealEngine\Engine\Binaries\Win64\UnrealEditor-Cmd.exe "
    EditorIOPort            = "54689"

    cmd = f"-set:ProjectName={ProjectName} -set:ProjectDir={ProjectDir} -set:Platform={Platform}" \
            f" -set:ClientConfig={ClientConfig} -set:OutputDir={OutputDir} -set:SkipBuildProject={SkipBuildProject}" \
                f" -set:SkipBuildEditor={SkipBuildEditor} -set:Unrealexe={Unrealexe} -set:EditorIOPort={EditorIOPort}"


    fileDir     = r"E:\UE\UE_4.27_Source\UnrealEngine\Engine\Build\BatchFiles\RunUAT.bat"
    target      = "MyBuild"
    script      = r"E:\AllProject\UE_5_2_0\BuildTest\BuildTools\Build.xml"

    cmd = f"{fileDir} BuildGraph -Script={script} -Target={target} {cmd}"

    print(f"cmd: {cmd}")

    ret = os.system(cmd)

    if ret == 0:
        print(f"run build ret val = {ret}")
    else:
        raise Exception("project build faild!")
        pass


if __name__ == "__main__":
    main(sys.argv[1:])
    input("press any to close")

这个py主要是拼接了参数到命令里面,方便配置命令。命令拼接好后拉起RunUAT.bat运行BuildGraph命令并传递命令参数。

注意target是我们后面Build.xml脚本里的MyBuild那个Agent

cmd: 打印了拼接的命令。

BuildGraph脚本Build.xml

<?xml version='1.0' ?>
<BuildGraph xmlns="http://www.epicgames.com/BuildGraph" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.epicgames.com/BuildGraph ../../Engine/Build/Graph/Schema.xsd">
    <!-- Base Options -->
    <Option Name="ProjectName"         DefaultValue=""                Description="project path like D:\UEProj\BuildTest\BuildTest.uproject" />
    <Option Name="ProjectDir"          DefaultValue=""                Description="for run BuildGraph scripts uproject, same as ProjectPath usually" />
    <Option Name="Platform"            DefaultValue=""                Description="target platform like Windows, Android, IOS and so on"/>
    <Option Name="ClientConfig"        DefaultValue="Development"     Description="config like Debug, Development, Shipping" />
    <Option Name="OutputDir"           DefaultValue=""                Description="" />
    <Option Name="SkipBuildProject"    DefaultValue="true"            Description="skip build project default = true" />
    <Option Name="SkipBuildEditor"     DefaultValue="true"            Description="skip build editor default = true " />
    <Option Name="Unrealexe"           DefaultValue=""                Description="like UnrealEngine\Engine\Binaries\Win64\UnrealEditor-Cmd.exe" />
    <Option Name="EditorIOPort"        DefaultValue="64752"           Description="ensure the port unuse" />


    <!-- Advance Options-->
    <Option Name="WithClean"           DefaultValue="false"           Description="clean before build" />
    <Option Name="WithCook"            DefaultValue="true"            Description="cook assets" />

    <Property Name="ProjectFullName"   Value="$(ProjectDir)$(ProjectName).uproject" />
    
    <!-- Base -->
    <Property Name="BaseCmd"           Value="-project=$(ProjectFullName) -ScriptsForProject=$(ProjectFullName)" />

    <!-- Check SDK Command -->
    <Property Name="CheckSDKCmd"       Value="Turnkey -command=VerifySdk -platform=Android -UpdateIfNeeded"            If="$(Platform) == Android" />

    <!-- Editor IO Command -->
    <Property Name="EditorIOCmd"       Value="-EditorIO -EditorIOPort=$(EditorIOPort)" />

    <!-- Sub Command -->
    <Property Name="CleanCmd"          Value="" />
    <Property Name="CleanCmd"          Value="-clean"                                              If="$(WithClean)" />

    <Property Name="HeadCmd"           Value="BuildCookRun -project=$(ProjectFullName) -target=BuildTest -platform=$(Platform)" />
    <Property Name="HeadCmd"           Value="$(HeadCmd) -cookflavor=ASTC"                         If="$(Platform) == Android" />
    <Property Name="HeadCmd"           Value="$(HeadCmd) -prereqs -nop4 -utf8output -Unrealexe=$(Unrealexe)" />

    <Property Name="BuildCmd"          Value="-build -clientconfig=$(ClientConfig)" />
    <Property Name="BuildCmd"          Value="$(BuildCmd) -nocompile -nocompileuat"                If="$(SkipBuildProject)" />
    <Property Name="BuildCmd"          Value="$(BuildCmd) -nocompileeditor -skipbuildeditor"       If="$(SkipBuildEditor)" />

    <Property Name="CookCmd"           Value="-cook -iostore -compressed" />
    <Property Name="CookCmd"           Value="$(BuildCmd) -skipcook"                               If="$(WithCook) == false" />


    <Property Name="PakCmd"            Value="-pak" />

    <Property Name="StageCmd"          Value="-stage" />

    <Property Name="PackageCmd"        Value="-package" />

    <Property Name="ArchiveCmd"        Value="-archive -archivedirectory=$(OutputDir)" />

    <!-- Client Command -->
    <Property Name="ClientCmd"         Value="$(BaseCmd) $(CheckSDKCmd) $(EditorIOCmd) $(HeadCmd) $(BuildCmd) $(CookCmd) $(PakCmd) $(StageCmd) $(PackageCmd) $(ArchiveCmd)" />

    <!-- Build -->
    <Agent Name="MyBuild"       Type="BuildOnWindows">
        <Node Name="MyBuildNode">
            <Log Message="BuildCookRun with arguments: $(ClientCmd)" />
            <Command Name="BuildCookRun"        Arguments="$(ClientCmd)" />
        </Node>
    </Agent>

</BuildGraph>

这个脚本就是进行根据条件拼接BuildCookRunUAT命令,它的参数可以在上一章的使用UAT打包构建的命令中找到(也可以参考后面示例的输出日志)。
BuildGraph 的命令的Target是MyBuild,MyBuild执行了BuildCookRun这个Command并把拼接命令传递过去。

日志和执行结果

日志
image
圈出的地方分别是py和Build.xml输出的命令行

执行结果
image
image

结语

  • 在打包的时候使用BuildGraph这一步不是必须的,完全可以直接使用py拼接BuildCookRun的命令,拉起UAT执行。不过BuildGraph在构建Editor时因为有现成的脚本会更方便些。
  • 这是在UE5.20环境下测试的,在UE4上应该是大同小异的
  • 这个是基于基本打包命令实现的,实际生产环境会控制更多的参数以及其他一些定制化的修改

标签:脚本,set,cmd,构建,Build,BuildGraph,UE,UE4,打包
From: https://www.cnblogs.com/hggzhang/p/17555012.html

相关文章

  • 3步带你搞定华为云编译构建CodeArts Build “新手村任务”
    华为云编译构建(CodeArtsBuild)基于云端大规模并发加速,为客户提供高速、低成本、配置简单的混合语言构建能力,帮助客户缩短构建时间,提升构建效率。本文将给各位开发者带来华为云CodeArtsPipeline的手把手初级教学,让没有接触过的开发者能够轻松上手体验。【操作步骤】体验准备:注......
  • python打包方法
    在Python中,要编写setup.py文件,用于构建和打包你的Python项目,你可以遵循以下步骤:创建项目目录结构:首先,你需要创建项目的目录结构,包括源代码文件、资源文件等。一个常见的项目结构如下:project_name/|-project_name/|-__init__.py|-module1.py......
  • 【嵌入式】构建嵌入式Linux系统(uboot、内核、文件系统)
    原文:https://zhuanlan.zhihu.com/p/573207792?utm_id=0知识架构及层次Linux内核由三部分构成:Bootloader:启动引导系统(可执行文件)Kernel:内核(可执行文件)RootFileSystem:根文件系统嵌入式Linux系统构成及启动略析嵌入式Linux启动类同4X100米接力跑,是由多个部分共同完成......
  • idea打包springboot项目,打包成war包,如何不把lib目录或指定jar打进去?
    1、在pom.xml文件中添加如下配置:<build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configuration>......
  • quarkus实战之二:应用的创建、构建、部署
    欢迎访问我的GitHub这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos本篇概览本文是《quarkus实战》系列的第二篇,目标是开发HelloWorld应用,让我们对quarkus有最基本的了解,写好的代码会在以下几种场景运行,这应该覆盖了大部分运行情况,绿色背......
  • 使用 Dockerfile 构建生产环境镜像
    传统部署的坑:1202年了,如果你连Docker都不知道是什么,我建议买一本书看看——或者谷歌一下,博客已经写烂了。为什么有这篇文章,是因为我在真正做容器化改造的时候,发现公司生产环境存在大量的坑:传统虚拟机部署,基本依赖克隆或者手工编译。由于人力原因,SRE历来单传,编译出来的PHP......
  • Avalonia项目打包安装包
    Avalonia项目打包安装包要将Avalonia项目打包成安装包,你可以使用Avalonia发布工具来完成1.创建一个发布配置文件在你的Avalonia项目中,创建一个发布配置文件。在项目文件夹中创建一个名为publish.xml的文件,并添加以下内容:<?xmlversion="1.0"encoding="utf-8"?><Publ......
  • 【问题解决】docker版本v23.0后,构建Dockerfile中FROM私库镜像报错构建失败
    问题情况Docker版本在v23.0以后,只要Dockerfile中FROM的私库镜像不存在本地,就会报错:#我本地是v24.0.2版本Docker[root@localhostipd]#dockerbuild.-tharbor.xxx.com.cn/test/bap:2.7.1[+]Building0.6s(3/3)FINISHED......
  • 一步一图带你构建 Linux 页表体系 —— 详解虚拟内存如何与物理内存进行映射
    笔者之前在自己的专栏《聊聊Linux内核》里通过大量的篇幅写了一个系列关于内存管理相关的文章,在这个系列文章中,笔者分别通过虚拟内存管理和物理内存管理两个角度算是把Linux内存管理子系统的全貌给大家呈现了出来。但之前的文章都是以专题的形式给大家呈现,采用一种静态的方......
  • 个人站点升级持续集成,自动构建和部署
    篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了个人站点升级持续集成,自动构建和部署相关的知识,希望对你有一定的参考价值。前言利用markdown+Hexo写文章,整体体验已经很棒。在写作过程中,节省了我不少时间。但是,美中不足的,就是发布的时候,需要手动输入命令,build好文件,......