You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Premake生成的Xcode项目文件平铺,如何实现文件夹嵌套展示?

问题:Premake5生成Xcode工作区后文件平铺显示,无法展示真实文件夹层级

当前文件夹结构

.
├── premake5.lua
├── DKEngine.xcworkspace
├── bin/                     
├── obj/                     
├── DKEngine/                
│   ├── DKEngine.xcodeproj
│   ├── ext/               
│   └── src/                 
│       ├── DKEngine.h
│       ├── DKEngine.cpp
├── Sandbox/                 
│   ├── Sandbox.xcodeproj
│   ├── ext/                 
│   └── src/                 
│       └── main.cpp

现有Premake脚本

workspace "DKEngine"
    architecture  "arm64"
    configurations 
    {
        "Debug",
        "Release",
        "Dist"
    }

outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}"
project "DKEngine"
    location "DKEngine"
    kind "SharedLib"
    language "C++"

    targetdir("bin/" .. outputdir .. "/%{prj.name}")
    objdir("obj/" .. outputdir .. "/%{prj.name}")

    files 
    {
        "%{prj.name}/src/**.h",
        "%{prj.name}/src/**.mm",
        "%{prj.name}/src/**.cpp"
    }

    includedirs
    {
        "%{prj.name}/ext"
    }

    cppdialect "C++20"
    staticruntime "On"
    systemversion "latest"

    postbuildcommands
    {
        ("{COPY} %{cfg.buildtarget.relpath} ../bin/" .. outputdir .. "/Sandbox")
    }
    
    filter "configurations:Debug"
        defines "DK_DEBUG"
        symbols "On"

project "Sandbox"
    location "Sandbox"
    kind "ConsoleApp" 
    language "C++"

    targetdir("bin/" .. outputdir .. "/%{prj.name}")
    objdir("obj/" .. outputdir .. "/%{prj.name}")

    files
    {
        "%{prj.name}/src/**h", -- 存在笔误,缺少点号
        "%{prj.name}/src/**.cpp"
    }

    includedirs
    {
        "%{prj.name}/ext",
        "DKEngine/src"
    }

    links
    {
        "DKEngine"
    }

    cppdialect "C++20"
    staticruntime "On"
    systemversion "latest"

    filter "configurations:Debug"
        defines "DK_DEBUG"
        symbols "On"

问题描述

打开生成的Xcode工作区后,所有源文件在项目导航器中以带引用箭头的形式平铺显示,未按实际的文件夹层级(如src)分组。


解决方案

核心原因

不是workspace或project的location设置导致的问题,而是你在files配置中使用了相对于工作区根目录的路径(比如%{prj.name}/src/**.h),Premake会把这些文件当成工作区根目录下的文件处理,因此Xcode会平铺显示。要让Xcode展示真实文件夹层级,需要让Premake识别文件的相对目录结构。

具体修改方案

1. 修正files路径为相对于Project Location的路径

每个Project的location已经指向了对应的子文件夹(比如DKEngine项目的location是DKEngine/),所以files里的路径可以直接写相对于该文件夹的路径,这样Premake会自动保留目录结构,Xcode就会生成对应的文件夹分组。同时要同步调整targetdir、objdir、includedirs的路径,适配相对位置的变化。

2. 修复Sandbox项目的笔误

Sandbox项目的files里"%{prj.name}/src/**h"缺少点号,改为"%{prj.name}/src/**.h"(或按方案1改成src/**.h)。

修改后的完整Premake脚本

workspace "DKEngine"
    architecture  "arm64"
    configurations 
    {
        "Debug",
        "Release",
        "Dist"
    }

outputdir = "%{cfg.buildcfg}-%{cfg.system}-%{cfg.architecture}"

project "DKEngine"
    location "DKEngine"
    kind "SharedLib"
    language "C++"

    -- 回退到根目录再指定输出路径
    targetdir("../bin/" .. outputdir .. "/%{prj.name}")
    objdir("../obj/" .. outputdir .. "/%{prj.name}")

    -- 使用相对于project location的路径,保留物理目录结构
    files 
    {
        "src/**.h",
        "src/**.mm",
        "src/**.cpp"
    }

    includedirs
    {
        "ext" -- 改为相对路径
    }

    cppdialect "C++20"
    staticruntime "On"
    systemversion "latest"

    postbuildcommands
    {
        ("{COPY} %{cfg.buildtarget.relpath} ../bin/" .. outputdir .. "/Sandbox")
    }
    
    filter "configurations:Debug"
        defines "DK_DEBUG"
        symbols "On"

project "Sandbox"
    location "Sandbox"
    kind "ConsoleApp" 
    language "C++"

    targetdir("../bin/" .. outputdir .. "/%{prj.name}")
    objdir("../obj/" .. outputdir .. "/%{prj.name}")

    -- 修正笔误+使用相对路径
    files
    {
        "src/**.h",
        "src/**.cpp"
    }

    includedirs
    {
        "ext", -- 相对路径
        "../DKEngine/src" -- 回退到根目录再指向DKEngine的src
    }

    links
    {
        "DKEngine"
    }

    cppdialect "C++20"
    staticruntime "On"
    systemversion "latest"

    filter "configurations:Debug"
        defines "DK_DEBUG"
        symbols "On"

额外优化:用vpaths自定义文件夹分组(可选)

如果需要更灵活的分组(比如把所有头文件放到统一的"Headers"组,源文件放到"Sources"组),可以在每个Project里添加vpaths配置:

-- 在DKEngine项目中添加
vpaths {
    ["Headers/*"] = "src/**.h",
    ["Sources/*"] = "src/**.cpp",
    ["Sources/ObjC++/*"] = "src/**.mm"
}

-- 在Sandbox项目中添加
vpaths {
    ["Headers/*"] = "src/**.h",
    ["Sources/*"] = "src/**.cpp"
}

这样Xcode里会按照你定义的分组展示文件,而非完全照搬物理目录结构。


内容的提问来源于stack exchange,提问作者CodingNoob

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 10:18:10