尝试导入一些模块,但是得到“ ..无法读取”

时间:2019-01-26 04:30:16

标签: d

我是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的所有位置都进行了搜索,仅找到一些简单的示例。

谢谢。

2 个答案:

答案 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"

将其添加为对其他项目的依赖项