我是D的新手,正在尝试使用子模块创建一个简单的入门项目。作为示例,我一直遵循d2d的源代码结构,但是我无法使用DUB来编译我的项目。
我的文件夹结构是:
Ranger
examples
template0 <== compiling in this directory
source
app.d
dub.json
source
ranger
geometry
package.d
point.d
package.d
app.d
包含:
import std.stdio;
import ranger;
void main()
{
writeln("Edit source/app.d to start your project.");
}
ranger / package.d:
module ranger;
public import ranger.geometry;
ranger / geometry / package.d:
module ranger.geometry;
public import ranger.geometry.point;
当我从template0
目录进行编译时,它总是失败:
dub build --force
无效的来源/导入路径:/ home / iposthuman / Documents / Development / D / Ranger / examples / template0 /〜/ Documents / Development / D / Ranger / source
使用x64_64的/home/iposthuman/dlang/dmd-2.084.0/linux/bin64/dmd执行“调试”构建。
template0〜master:构建配置“应用程序” ...
/home/iposthuman/Documents/Development/D/Ranger/source/ranger/package.d(5,15):错误:模块
geometry
在文件'ranger / geometry.d'中,不能阅读导入路径[0] =源导入路径1 = / home / iposthuman / Documents / Development / D / Ranger / source 导入路径[2] = /home/iposthuman/dlang/dmd-2.084.0/linux/bin64/../../src/phobos 导入路径[3] = /home/iposthuman/dlang/dmd-2.084.0/linux/bin64 /../../ src / druntime / import
/home/iposthuman/dlang/dmd-2.084.0/linux/bin64/dmd失败,退出代码为1。
1)我不明白为什么导入路径将两条路径粉碎在一起,我不知道如何解决它。 2)我不了解涉及的geometry.d,因为没有一个名为geometry.d的文件-但有一个包含软件包的文件夹。 ...我很困惑。
我的dub.json包含我认为是护林员源代码的正确路径:
{
"authors": [
"William Cleveland"
],
"copyright": "Copyright © 2019, William Cleveland",
"description": "A minimal D application.",
"license": "MIT",
"name": "template0",
"importPaths": [
"source",
"~/Documents/Development/D/Ranger/source"
]
}
我使用DUB错误还是配置json错误?
我不认为仅使用D就能获得基本的工作就不会那么困难。我在Modules的所有位置都进行了搜索,仅找到一些简单的示例。
谢谢。
答案 0 :(得分:2)
Dub不会将~
转换为您的主目录。 ~
使用POSIX,但是dub是跨平台应用程序。
使用/home/iposthuman/Documents/Development/D/Ranger/source
或../../source
。
最好是后者,因为当您的用户名更改或您与其他人共享项目时,它不会中断。
答案 1 :(得分:0)
我认为weltensturm的答案是正确的主意,但略有偏离。我会改变
"importPaths": [
"source",
"~/Documents/Development/D/Ranger/source"
]
到
"importPaths": [
"source",
"../../../source"
]
基本上,您只需要再返回一个目录即可访问源。
我不了解涉及的geometry.d,因为没有一个名为geometry.d的文件-但是有一个包含软件包的文件夹。 ...我很困惑。
这是因为,当您导入模块时,dub希望存在一个具有该名称的文件或package.d文件,就像您在具有模块名称的文件夹中一样。因此,如果执行import foo;
,则在名为foo的文件夹中应该有一个名为foo.d或package.d的文件,该文件的开头为module foo;
。我认为您所拥有的是对的,但是由于导入路径错误,因此dub在错误的位置查找geometry.d或文件夹几何。
旁注,您始终可以使用dub将要导入的文件夹转到包中。并运行dub add-local ./
。然后,您可以通过执行"my-project": "~master"