如何用Premake5批量链接文件夹中的所有Unity DLL?
问题:Premake5批量链接Unity DLL的需求
我正将部分Unity代码迁移至VS2022项目以使用插件,由于代码引用大量Unity类,需链接Unity安装目录中的DLL文件。我希望用Premake5生成项目,目前仅能通过libdirs指定目录后,用link手动指定单个DLL(如UnityEditor.dll),但link指令似乎不支持files那样的通配符。请问是否有无需手动罗列所有DLL的方法?也可接受具备可移植性的Lua解决方案。
以下是仅链接单个DLL的参考premake.lua代码:
local ROOT = "../" local SOURCE = ROOT.."Source/" local BUILD = ROOT.."Build/" workspace "RELoad_CorePlugin" configurations { "Debug", "Release" } location (ROOT) dotnetframework "net6.0" project "RELoad_Core" kind "SharedLib" language "C#" libdirs "C:/Program Files/Unity/2021.3.12f1/Editor/Data/Managed/UnityEngine/" -- hard coded for now links "UnityEditor.dll" targetdir (ROOT.."Output") location (BUILD) files (SOURCE.."Core/**.cs")
解决方案
方法一:Lua遍历目录自动收集所有DLL
Premake基于Lua,可直接用其文件系统API遍历指定目录下的DLL文件,批量添加到links中。修改后的脚本示例:
local ROOT = "../" local SOURCE = ROOT.."Source/" local BUILD = ROOT.."Build/" -- 可通过环境变量或命令行参数传递路径,提升可移植性 local UNITY_MANAGED_DIR = os.getenv("UNITY_MANAGED_DIR") or "C:/Program Files/Unity/2021.3.12f1/Editor/Data/Managed" -- 遍历目录获取所有.dll文件(支持子目录) local function get_all_dlls(dir) local dlls = {} local files = os.matchfiles(dir .. "/**/*.dll") for _, file in ipairs(files) do -- 提取不带路径的文件名,links仅需文件名 table.insert(dlls, path.getname(file)) end return dlls end workspace "RELoad_CorePlugin" configurations { "Debug", "Release" } location (ROOT) dotnetframework "net6.0" project "RELoad_Core" kind "SharedLib" language "C#" -- 包含Unity所有托管DLL的目录(按需添加子目录) libdirs { UNITY_MANAGED_DIR .. "/UnityEngine", UNITY_MANAGED_DIR .. "/UnityEditor" } -- 批量链接所有收集到的DLL links(get_all_dlls(UNITY_MANAGED_DIR)) targetdir (ROOT.."Output") location (BUILD) files (SOURCE.."Core/**.cs")
方法二:筛选特定DLL(避免冗余链接)
如果不需要链接目录下全部DLL,可在遍历过程中添加过滤逻辑,比如仅保留Unity前缀的DLL:
local function get_unity_dlls(dir) local dlls = {} local files = os.matchfiles(dir .. "/**/*.dll") for _, file in ipairs(files) do local dll_name = path.getname(file) -- 只保留以Unity开头的DLL if string.startswith(dll_name, "Unity") then table.insert(dlls, dll_name) end end return dlls end -- 在project中替换为该函数: links(get_unity_dlls(UNITY_MANAGED_DIR))
可移植性优化
- 从环境变量
UNITY_MANAGED_DIR读取Unity路径,不同机器只需配置对应环境变量即可,无需修改脚本。 - 支持通过命令行参数传递路径,执行时使用:
premake5 vs2022 --unitydir="你的Unity托管目录路径",对应的Lua代码:
local UNITY_MANAGED_DIR = _OPTIONS["unitydir"] or os.getenv("UNITY_MANAGED_DIR") or "默认Unity托管目录路径"
内容的提问来源于stack exchange,提问作者Robert Hull
相关产品推荐
相关产品推荐

