日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

springtboot 引用子工程的文件_xmake从入门到精通11:如何组织构建大型工程

發(fā)布時(shí)間:2023/12/10 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 springtboot 引用子工程的文件_xmake从入门到精通11:如何组织构建大型工程 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

xmake是一個(gè)基于Lua的輕量級(jí)現(xiàn)代化c/c++的項(xiàng)目構(gòu)建工具,主要特點(diǎn)是:語(yǔ)法簡(jiǎn)單易上手,提供更加可讀的項(xiàng)目維護(hù),實(shí)現(xiàn)跨平臺(tái)行為一致的構(gòu)建體驗(yàn)。

本文主要詳細(xì)講解下,如何通過(guò)配置子工程模塊,來(lái)組織構(gòu)建一個(gè)大規(guī)模的工程項(xiàng)目。

  • 項(xiàng)目源碼
  • 官方文檔

維護(hù)簡(jiǎn)單的項(xiàng)目結(jié)構(gòu)

對(duì)于一些輕量型的小工程,通常只需要單個(gè)xmake.lua文件就能搞定,大體結(jié)構(gòu)如下:

projectdir- xmake.lua- src- test- *.c- demo- *.c

源碼下面層級(jí)簡(jiǎn)單,通常只需要在項(xiàng)目根目錄維護(hù)一個(gè)xmake.lua來(lái)定義所有target就能完成構(gòu)建,看上去并不是很復(fù)雜,也很清晰。

-- 在根域設(shè)置通用配置,當(dāng)前所有targets都會(huì)生效 add_defines("COMMON")target("test")set_kind("static")add_files("src/test/*.c")add_defines("TEST")target("demo")set_kind("static")add_files("src/demo/*.c")add_defines("DEMO")

維護(hù)復(fù)雜的項(xiàng)目結(jié)構(gòu)

但是對(duì)于一些大型項(xiàng)目,通常的組織結(jié)構(gòu)層次很多也很深,需要編譯的target目標(biāo)也可能有十幾甚至上百個(gè),這個(gè)時(shí)候如果還是都在根xmake.lua文件中維護(hù),就有點(diǎn)吃不消了。

這個(gè)時(shí)候,我們就需要通過(guò)在每個(gè)子工程模塊里面,單獨(dú)創(chuàng)建xmake.lua來(lái)維護(hù)他們,然后使用xmake提供的includes接口,將他們按層級(jí)關(guān)系包含進(jìn)來(lái),最終變成一個(gè)樹(shù)狀結(jié)構(gòu):

projectdir- xmake.lua- src- test- xmake.lua- test1- xmake.lua- test2- xmake.lua- test3- xmake.lua- demo- xmake.lua- demo1- xmake.lua- demo2- xmake.lua...

然后,根xmake.lua會(huì)將所有子工程的xmake.lua通過(guò)層級(jí)includes全部引用進(jìn)來(lái),那么所有定義在子工程的target配置也會(huì)完全引用進(jìn)來(lái),我們?cè)诰幾g的時(shí)候永遠(yuǎn)不需要單獨(dú)去切到某個(gè)子工程目錄下操作,只需要:

$ xmake build test1 $ xmake run test3 $ xmake install demo1

就可以編譯,運(yùn)行,打包以及安裝指定的子工程target,所以除非特殊情況,平常不推薦來(lái)回切換目錄到子工程下單獨(dú)編譯,非常的繁瑣。

根xmake.lua文件配置

通常推薦的做法就是在根xmake.lua中僅僅配置一些對(duì)所有target都通用的設(shè)置,以及includes對(duì)子工程的引用,不放置對(duì)targets的定義,例如:

-- define project set_project("tbox") set_xmakever("2.3.2") set_version("1.6.5", {build = "%Y%m%d%H%M"})-- set common flags set_warnings("all", "error") set_languages("c99") add_cxflags("-Wno-error=deprecated-declarations", "-fno-strict-aliasing", "-Wno-error=expansion-to-defined") add_mxflags("-Wno-error=deprecated-declarations", "-fno-strict-aliasing", "-Wno-error=expansion-to-defined")-- add build modes add_rules("mode.release", "mode.debug")-- includes sub-projects includes("test", "demo")

xmake里面所有的設(shè)置都是按tree狀繼承的,根xmake.lua中的root域設(shè)置會(huì)對(duì)所有includes的子xmake.lua里面的targets生效, 但反過(guò)來(lái)不會(huì),子xmake.lua里面的root域設(shè)置僅對(duì)它下面的子xmake.lua生效,不會(huì)影響到父xmake.lua中定義的targets。

子xmake.lua文件配置

所以,我們可以在每個(gè)子工程目錄中,單獨(dú)配置xmake.lua,里面的所有配置不會(huì)干擾父xmake.lua,只對(duì)它下面的更細(xì)粒度的子工程生效,就這樣一層層按tree狀生效下去。

由于,已經(jīng)在根xmake.lua配置了大部分通用配置,那么我們可以在test子工程下,專(zhuān)心配置只對(duì)test有用的設(shè)置,例如對(duì)于projectdir/test/xmake.lua:

add_defines("TEST")target("test1")set_kind("static")add_files("test1/*.c")add_defines("TEST1")target("test2")set_kind("static")add_files("test2/*.c")add_defines("TEST2")

我們可以在這里定義test的所有target,當(dāng)然也可以繼續(xù)分層,在每個(gè)test1, test2目錄下單獨(dú)維護(hù)xmake.lua,這個(gè)看自己項(xiàng)目的規(guī)模來(lái)決定。

比如:

add_defines("TEST") includes("test1", "test2")

test1/xmake.lua

target("test1")set_kind("static")add_files("test1/*.c")add_defines("TEST1")

test2/xmake.lua

target("test2")set_kind("static")add_files("test2/*.c")add_defines("TEST2")

而這里面的add_defines("TEST")在root域,會(huì)對(duì)test1/test2兩個(gè)target都生效,但是對(duì)于demo目錄的target不生效,因?yàn)樗鼈兪瞧郊?jí)的,沒(méi)有tree狀繼承關(guān)系。

跨xmake.lua間目標(biāo)依賴(lài)

雖然,projectdir/test/xmake.lua和projectdir/demo/xmake.lua兩個(gè)子工程目錄是平級(jí)關(guān)系,配置無(wú)法相互干擾,但是targets是可以跨xmake.lua訪問(wèn)的,來(lái)實(shí)現(xiàn)目標(biāo)間的依賴(lài)。

比如demo需要依賴(lài)test靜態(tài)庫(kù),進(jìn)行鏈接使用,那么demo下xmake.lua可以這么寫(xiě):

target("demo1")set_kind("binary")add_files("demo1/*.c")add_deps("test1")

只要通過(guò)add_deps("test1")關(guān)聯(lián)上對(duì)應(yīng)其他子工程目標(biāo)作為依賴(lài)即可,test1靜態(tài)庫(kù)會(huì)優(yōu)先編譯,并且demo可執(zhí)行程序會(huì)自動(dòng)link上它生成的libtest1.a庫(kù)。

文件路徑的層級(jí)關(guān)系

我們需要記住,所有跟路徑相關(guān)的配置接口,比如add_files, add_includedirs等都是相對(duì)于當(dāng)前子工程xmake.lua所在的目錄的,所以只要添加的文件不跨模塊,那么設(shè)置起來(lái)只需要考慮當(dāng)前的相對(duì)路徑就行了。

projectdir- test- xmake.lua- test1/*.c- test2/*.c

比如,這里添加的源文件路徑,都是相對(duì)于test子工程目錄的,我們不需要去設(shè)置絕對(duì)路徑,這樣會(huì)簡(jiǎn)化很多。

target("test1")add_files("test1/*.c") target("test2")add_files("test2/*.c")

當(dāng)然,如果我們有特殊需求,非要設(shè)置工程其他子模塊下的文件路徑呢?兩種辦法,通過(guò)../../的方式一層層繞出去,另外一種就是使用$(projectdir)內(nèi)置變量,它表示項(xiàng)目全局根目錄。

比如在demo子工程下:

target("demo1")set_kind("binary")add_files("demo1/*.c")add_files("../../test/test1/*.c")

或者:

target("demo1")set_kind("binary")add_files("demo1/*.c")add_files("$(projectdir)/test/test1/*.c")

includes接口使用進(jìn)階

錯(cuò)誤的使用方式

includes這個(gè)接口屬于全局接口,不隸屬于任何target,所以請(qǐng)不要在target內(nèi)部調(diào)用,下面是錯(cuò)誤的用法:

target("test")set_kind("static")includes("test1", "test2")add_files("test/*.c")

正確的用法是:

includes("test1", "test2") target("test")set_kind("static")add_files("test/*.c")

或者:

target("test")set_kind("static")add_files("test/*.c") target_end()-- 在下面調(diào)用,需要先顯式退出target作用域 includes("test1", "test2")

引用目錄或文件

另外,includes既可以引用目錄,也可以直接引用文件,如果test1目錄下存在xmake.lua,那么可以直接includes("test1")來(lái)引用目錄。

如果test1目錄下是其他xxxx.lua命令的項(xiàng)目文件,可以通過(guò)指定文件來(lái)引用:includes("test1/xxxx.lua"),效果一樣的。

模式匹配進(jìn)行批量導(dǎo)入

includes還支持通過(guò)模式匹配的方式來(lái)批量導(dǎo)入多個(gè)子工程,比如:

includes("test/*/xmake.lua")

可以導(dǎo)入test目錄下,所有test1, test2等子工程目錄下的配置,如果是**還支持遞歸多級(jí)匹配

includes("test/**/xmake.lua")

通過(guò)模式匹配,我們只需要在test/xmake.lua一處地方進(jìn)行includes,以后用戶(hù)在新增其他子工程xmake.lua,就會(huì)自動(dòng)導(dǎo)入進(jìn)來(lái),非常方便。

注意事項(xiàng)

另外,在使用includes的過(guò)程中,需要注意的一點(diǎn)是,它不是c語(yǔ)言的#include,因此在當(dāng)前配置中includes子配置,當(dāng)前配置是不會(huì)有任何影響的,比如:

includes("xxx") target("test")-- ...

上面includes了一些子工程,但是這些子工程的配置是不會(huì)干擾當(dāng)前test目標(biāo)程序的。

https://tboox.org/cn/2020/04/11/quickstart-11-subprojects/

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的springtboot 引用子工程的文件_xmake从入门到精通11:如何组织构建大型工程的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 免费av中文字幕 | 免费成人深夜夜行网站视频 | 激情图片在线视频 | 日本道在线观看 | 九色在线| 国产视频在线观看一区 | 国产精品海角社区 | 日韩二级片 | xxx一区| 亚洲在线视频一区 | 久久精品成人一区二区三区蜜臀 | 美女涩涩视频 | www.桃色| 老女人做爰全过程免费的视频 | 国产一区在线播放 | 国内外成人激情视频 | 香蕉视频A | 亚洲不卡一区二区三区 | 久久精品国产电影 | 久久久久久9999 | 日本a一级片 | 成人在线免费视频 | 亚洲一级精品 | 中文字幕精品一二三四五六七八 | 黄色理论片 | 免费观看的黄色网址 | 黑人一级 | 在线观看视频www | 一卡二卡在线视频 | 午夜一本 | 99精品欧美 | 亚洲免费视 | 爆操女秘书 | 精品一级少妇久久久久久久 | 欧美国产日韩一区二区 | 欧美特级a | 老汉av| 91中文字幕视频 | 秋霞成人午夜伦在线观看 | 深夜福利网站在线观看 | 欧美久久久久久又粗又大 | 午夜丰满寂寞少妇精品 | www.奇米.com | 白嫩白嫩国产精品 | av日韩不卡 | 亚洲国产日韩a在线播放性色 | 黄网在线免费看 | 亚洲激情一区二区三区 | 91一区二区在线观看 | 一区二区日韩在线观看 | 噜噜在线视频 | 第一av在线 | 久久久久久九九九九 | 亚洲综合激情五月久久 | 成年人在线免费观看网站 | 成人录像 | 好男人www在线视频 我们的2018在线观看免费高清 | 久久精品视频在线免费观看 | 日韩欧美高清片 | 久久久久久亚洲av毛片大全 | 91久久国产综合久久91 | 奶波霸巨乳一二三区乳 | 色婷婷一区二区三区四区 | 日韩av一级片 | 欧美综合在线一区 | 日韩激情中文字幕 | 色老妹| 精品国产乱码久久久久久蜜臀 | 欧美一区二区三区在线观看视频 | 色综合成人 | 午夜寂寞影视 | 134vcc影院免费观看 | 久久国产精品国产精品 | www.夜夜操 | 欧美成人区 | 免费播放片大片 | 影音先锋中文字幕人妻 | 久久久亚洲精品无码 | 夜夜草| 91亚瑟视频 | 免费观看视频在线观看 | 91网站免费观看 | 日韩国产小视频 | 日本欧美在线播放 | 精品久久人人 | 国产性生活网站 | 日韩网站免费 | 国产又粗又黄又爽 | 在线观看高h| 久久国产亚洲精品无码 | 日本少妇与黑人 | 久久综合婷婷 | 免费观看高清在线 | 悟空影视大全免费高清观看在线 | 日本三级大全 | 婷婷久 | 亚洲免费毛片 | 国产成人福利在线 | 综合色区 |