影响传递给编译器与链接器
的壳选项
.所有设置
都是可选
的.可用$
环境变量,自身用$$
表示.不匹配预定义
的,就用环境变量
.
//=== "dub.sdl"
...
dependency "vibe-d" version="~>0.9.5"
dependency "localdep" path="../localdep" optional=true default=true
dependency "remote" repository="git+https://example.org/remote.git" version="a1b2c3d4"
dependency "modified" version="~>1.2.3" {
dflags "--special-flag" "-O4"
}
//=== "dub.json"
...
"dependencies": {
"vibe-d": "~>0.9.5",
"localdep": {
"path": "../localdep",
"optional": true,
"default": true
},
"remote": {
"repository": "git+https://example.org/remote.git",
"version": "a1b2c3d4"
},
"modified": {
"version": "~>1.2.3",
"dflags": ["--special-flag", "-O4"]
}
}
参数:"名":...
对每个使用
的依赖
添加依赖(dependency)
指令.
此设置
不支持平台规范.
版本细节
systemDependencies "OpenSSL (1.1.0 或 later, 1.0.0i also supported)"
targetType "executable"
值 | 意思 |
---|---|
"自动检测(autodetect)" | 自动检测目标类型 .这是默认值 ,使dub 生成两个"application" 和"library" 配置.用额外值只生成一个 .配置 块内禁止 此值. |
"无(none)" | 不编译 ,也不输出 文件.对应用"dependency" 指令拖进额外包或子包 的包很有用. |
"可执行(executable)" | 生成可执行 二进制文件.(如,在Windows 上为exe ) |
"library" | 指定不限制 实际类型的按库 用包.这是大多数库 的默认值 . |
"源库(sourceLibrary)" | 不生成二进制 ,而是强制dub 直接添加所有源文件 作依赖. |
"静态库(staticLibrary)" | 强制输出为静态库.(如lib/a 文件) |
"动态库(dynamicLibrary)" | 强制输出为动态/共享库 .(如.dll 或.dylib 或.so .) |
targetName "cloudapp"
自动添加特定类型和平台的前后缀
.
targetName "cloudapp"
targetType "library"
= cloudapp.lib //Windows
= libcloudapp.a //Linux
//
targetName "cloudapp"
targetType "executable"
= cloudapp.exe //Windows
= cloudapp //Linux
targetPath "bin"
输出二进制
文件的目标路径
.
workingDirectory "bin"
生成的可执行
文件的固定工作目录
.
subConfiguration "avrd" "atmega1284p"
subConfiguration "vibe-d/tls" "botan"
subConfiguration ":subpackage" "FromRoot"
参数为"<依赖>" "<配置>"
,为特定配置
,锁定依赖
.
buildRequirements "allowWarnings" "requireContracts"
参数:"要求" ...
.构建
过程所需设置
列表.
细节在此
buildOptions "allowWarnings" "requireContracts"
libs "mycommons"
libs "advapi32" "wldap32" platform="windows"
libs "ldap" "lber" platform="posix"
//sdl对比json
"libs": ["mycommons"],
"libs-windows": ["advapi32", "wldap32"],
"libs-posix": ["ldap", "lber"]
库名
根据编译器
转换为适当的链接器标志
.如ssl=>-L-lssl
.
posix
,先用pkg-config --exists
来检查标志.
sourceFiles "doc2.d" "latex.d" "cgi.d" "comment.d" "css/*.d"
//
"sourceFiles": ["doc2.d", "latex.d", "cgi.d", "comment.d", "css/*.d"]
支持全局匹配
.
对添加
普通源目录
中不包含的某些配置或平台
相关源文件
很有用,用来给编译器传递
附加文件.
sourcePaths "source"
"sourcePaths": ["source"]
自定义查找源文件
的路径,未指定,则用"source"或"src"
注意,一般还需要定义"importPaths"
,因为"sourcePaths"
不会影响它,并且这是可相互
导入源文件
所必需.
sourceFiles/sourcePaths
非常重要.用来找要编译/导入
的源文件
.
excludedSourceFiles "source/server/*.d" "source/main.d"
sourceFiles/sourcePaths
中要排除的源文件
.
mainSourceFile "source/vibe/appmain.d"
确定包含main()
函数的文件.在定义了不同的main
函数时(如"dub test"
),dub
可用此设置
来排除文件.
copyFiles "LICENSE_MYDEP.txt"
copyFiles "libs/win64/*.dll" platform="windows-x86_64"
copyFiles "libs/win32/*.dll" platform="windows-x86"
复制文件,到targetPath
.默认递归复制
"copyFiles": ["path/to/dir"]
//递归复制
"copyFiles": ["path/to/dir/*"]
//仅复制一层
支持全局匹配
.
extraDependencyFiles "libs/*"
重新生成dub
项目的匹配文件
.
不必此设置,因为已检查所有源文件
,导入
文件与串导入
文件是否更新.但是,在重复更新
静态库时,可能有用.支持全局匹配
.
条件编译的版本
versions "NoNetwork" "DemoMode"
示例:
void draw()
{
version (DemoMode)
{
drawText("DEMO MODE");
}
}
注意:(可选)存在
的依赖项
已定义Have_*
版本.
debugVersions "SQLTests"
示例:
// 避免使用sourceLibrary依赖项污染依赖项的单元测试
debug (SQLTests)
{
unittest
{
assert(everythingWorks());
}
}
importPaths "source" "extern"
搜索D模块
的额外导入
路径(默认,用source/
目录).
建议把所有源路径
放入导入路径
中,以便可相互
导入源.
如对外部链接
的库代码,可定义额外导入路径
.如果仅使用导入路径
中代码,而不链接
包含实际定义
的目标文件
,则可能会有链接
错误.
等价于dmd
中的-I
.
importPaths "views"
搜索串导入
的额外导入路径,默认为views/
.
import("filename.ext")
语句用他们.相当于-J
路径.
示例:
//example.d
//加载要嵌入到`可执行`文件中的文件
static immutable string[] mirrors = import("mirrors.txt").split("\n");
//嵌入二进制文件到可执行文件中
//(如,加载`GTK`资源,加载嵌入DLL等)
static immutable ubyte[] resources = cast(immutable(ubyte)[])import("resources.gresource");
//views/mirrors.txt
https://example.org
https://example.com
//views/resources.gresource
<二进制内容>
...
// 特殊条件下重建
preGenerateCommands `if [ -f some_condition ]; then touch source/app.d; fi`
生成项目前执行的壳
命令列表
在dub build,dub run
和dub generate
上运行.
即使不需要
重新编译包,或生成makefile
等文件时,也会执行此命令
.
如果写入由源文件,导入路径,串导入路径
或extraDependencyFiles
观察的文件,则重新生成此包
.
如果要在重新生成
时更新
源文件,可用(预生成
命令)它.
类似.
preBuildCommands `$DUB --single update_git_version.d`
在dub build和dub run
前跑.
postBuildCommands `gpg --sign my_executable`
类似.
preRunCommands `echo "EXECUTABLE OUTPUT:"`
dub run
前运行.
preRunCommands `./cleanup.sh`
dub run
后运行.
...
dflags `--relocation-model=rwpi` platform="ldc"
传递给D编译器的额外
标志
标志
通常特定于正在使用的编译器
,但会自动从DMD
转换一组标志
到指定编译器
.见构建选项
.
...
lflags `-L$PACKAGE_DIR/libs/`
传递给链接器的额外
标志,一般与正在使用
的链接器
相关.
injectSourceFiles `inject/*.d`
将编译源文件
进依赖此包
的二进制
文件.
应在像Boost
的宽松许可文件中用,否则有风险
.
//=== "dep/dub.json"
{
"name": "toload",
"description": "展示从依赖项注入源文件的示例.",
"targetType": "library",
"buildOptions": ["betterC"],
"sourcePaths": ["source"],
"importPaths": ["source"],
"injectSourceFiles": ["ahook.d"]
}
//=== "dep/ahook.d"
module ahook;
version(D_BetterC) {
pragma(crt_constructor)
extern(C) void someInitializer() {
import core.stdc.stdio;
printf("跑勾挂!\n");
}
} else {
shared static this() {
import std.stdio;
writeln("有运行时!!!!");
}
}
//=== "dep/source/something.d"
module something;
void doSomething() {
import core.stdc.stdio;
version(D_BetterC) {
printf("不在exe中");
} else {
printf("在exe中");
}
}
//=== "app/dub.json"
{
"name": "runner",
"description": "展示从依赖项运行器注入源文件的示例",
"targetType": "executable",
"dependencies": {
"dep": "~>1.0.0"
}
}
//=== "app/source/entry.d"
void main() {
import something;
doSomething();
}
注入源文件
将从依赖定义它们的依赖项
的项目上下文
中导入
文件.