118 lines
4.8 KiB
C#
118 lines
4.8 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using UnityEditor;
|
|
|
|
namespace YooAsset.Editor
|
|
{
|
|
[TaskAttribute("更新构建信息")]
|
|
public class TaskUpdateBuildInfo : IBuildTask
|
|
{
|
|
void IBuildTask.Run(BuildContext context)
|
|
{
|
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
|
var buildMapContext = context.GetContextObject<BuildMapContext>();
|
|
string pipelineOutputDirectory = buildParametersContext.GetPipelineOutputDirectory();
|
|
string packageOutputDirectory = buildParametersContext.GetPackageOutputDirectory();
|
|
int outputNameStyle = (int)buildParametersContext.Parameters.OutputNameStyle;
|
|
|
|
// 1.检测路径长度
|
|
foreach (var bundleInfo in buildMapContext.BundleInfos)
|
|
{
|
|
// NOTE:检测路径长度不要超过260字符。
|
|
string filePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
|
if (filePath.Length >= 260)
|
|
throw new Exception($"The output bundle name is too long {filePath.Length} chars : {filePath}");
|
|
}
|
|
|
|
// 2.更新构建输出的文件路径
|
|
foreach (var bundleInfo in buildMapContext.BundleInfos)
|
|
{
|
|
if (bundleInfo.IsEncryptedFile)
|
|
bundleInfo.PatchInfo.BuildOutputFilePath = bundleInfo.EncryptedFilePath;
|
|
else
|
|
bundleInfo.PatchInfo.BuildOutputFilePath = $"{pipelineOutputDirectory}/{bundleInfo.BundleName}";
|
|
}
|
|
|
|
// 3.更新文件其它信息
|
|
foreach (var bundleInfo in buildMapContext.BundleInfos)
|
|
{
|
|
string buildOutputFilePath = bundleInfo.PatchInfo.BuildOutputFilePath;
|
|
bundleInfo.PatchInfo.ContentHash = GetBundleContentHash(bundleInfo, context);
|
|
bundleInfo.PatchInfo.PatchFileHash = GetBundleFileHash(buildOutputFilePath, buildParametersContext);
|
|
bundleInfo.PatchInfo.PatchFileCRC = GetBundleFileCRC(buildOutputFilePath, buildParametersContext);
|
|
bundleInfo.PatchInfo.PatchFileSize = GetBundleFileSize(buildOutputFilePath, buildParametersContext);
|
|
}
|
|
|
|
// 4.更新补丁包输出的文件路径
|
|
foreach (var bundleInfo in buildMapContext.BundleInfos)
|
|
{
|
|
string patchFileName = PatchManifest.CreateBundleFileName(outputNameStyle, bundleInfo.BundleName, bundleInfo.PatchInfo.PatchFileHash);
|
|
bundleInfo.PatchInfo.PatchOutputFilePath = $"{packageOutputDirectory}/{patchFileName}";
|
|
}
|
|
}
|
|
|
|
private string GetBundleContentHash(BuildBundleInfo bundleInfo, BuildContext context)
|
|
{
|
|
var buildParametersContext = context.GetContextObject<BuildParametersContext>();
|
|
var parameters = buildParametersContext.Parameters;
|
|
var buildMode = parameters.BuildMode;
|
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
|
return "00000000000000000000000000000000"; //32位
|
|
|
|
if (bundleInfo.IsRawFile)
|
|
{
|
|
string filePath = bundleInfo.PatchInfo.BuildOutputFilePath;
|
|
return HashUtility.FileMD5(filePath);
|
|
}
|
|
|
|
if (parameters.BuildPipeline == EBuildPipeline.BuiltinBuildPipeline)
|
|
{
|
|
var buildResult = context.GetContextObject<TaskBuilding.BuildResultContext>();
|
|
var hash = buildResult.UnityManifest.GetAssetBundleHash(bundleInfo.BundleName);
|
|
if (hash.isValid)
|
|
return hash.ToString();
|
|
else
|
|
throw new Exception($"Not found bundle in build result : {bundleInfo.BundleName}");
|
|
}
|
|
else if (parameters.BuildPipeline == EBuildPipeline.ScriptableBuildPipeline)
|
|
{
|
|
// 注意:当资源包的依赖列表发生变化的时候,ContentHash也会发生变化!
|
|
var buildResult = context.GetContextObject<TaskBuilding_SBP.BuildResultContext>();
|
|
if (buildResult.Results.BundleInfos.TryGetValue(bundleInfo.BundleName, out var value))
|
|
return value.Hash.ToString();
|
|
else
|
|
throw new Exception($"Not found bundle in build result : {bundleInfo.BundleName}");
|
|
}
|
|
else
|
|
{
|
|
throw new System.NotImplementedException();
|
|
}
|
|
}
|
|
private string GetBundleFileHash(string filePath, BuildParametersContext buildParametersContext)
|
|
{
|
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
|
return "00000000000000000000000000000000"; //32位
|
|
else
|
|
return HashUtility.FileMD5(filePath);
|
|
}
|
|
private string GetBundleFileCRC(string filePath, BuildParametersContext buildParametersContext)
|
|
{
|
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
|
return "00000000"; //8位
|
|
else
|
|
return HashUtility.FileCRC32(filePath);
|
|
}
|
|
private long GetBundleFileSize(string filePath, BuildParametersContext buildParametersContext)
|
|
{
|
|
var buildMode = buildParametersContext.Parameters.BuildMode;
|
|
if (buildMode == EBuildMode.DryRunBuild || buildMode == EBuildMode.SimulateBuild)
|
|
return 0;
|
|
else
|
|
return FileUtility.GetFileSize(filePath);
|
|
}
|
|
}
|
|
} |