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

问题描述 投票:0回答:2

我是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.");
}

游侠/ package.d:

module ranger;

public import ranger.geometry;

游侠/几何/ package.d:

module ranger.geometry;

public import ranger.geometry.point;

当我从template0目录编译时它会一直失败:

配音构建--force

源/导入路径无效:/ home / iposthuman / Documents / Development / D / Ranger / examples / template0 /〜/ Documents / Development / D / Ranger / source

使用/home/iposthuman/dlang/dmd-2.084.0/linux/bin64/dmd为x86_64执行“debug”构建。

template0~master:构建配置“应用程序”...

/home/iposthuman/Documents/Development/D/Ranger/source/ranger/package.d(5,15):错误:模块geometry在文件'ranger / geometry.d'中无法读取

import path [0] = source import path1 = / home / iposthuman / Documents / Development / D / Ranger / source import path [2] = /home/iposthuman/dlang/dmd-2.084.0/linux/bin64/../ ../src/phobos import path [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只是为了让一些基本工作变得困难。我在模块上到处搜索,只找到了一些简单的例子。

谢谢。

d
2个回答
2
投票

Dub不会将~翻译成您的主目录。 ~是POSIX说话,但dub是一个跨平台的应用程序。

要么使用/home/iposthuman/Documents/Development/D/Ranger/source,要么使用../../source

最好是后者,因为当用户名更改或与其他人共享项目时,它不会中断。


0
投票

我认为weltensturm的答案是正确的想法,但稍微偏离。我会改变

"importPaths": [
    "source",
    "~/Documents/Development/D/Ranger/source"
]

"importPaths": [
    "source",
    "../../../source"
]

基本上你只需要再回一个目录来访问源代码。

我不理解涉及geometry.d,因为没有一个名为geometry.d的文件 - 但是有一个包含一个文件夹的文件夹。 ...我很迷惑。

这是因为当您导入模块时,dub期望有一个具有该名称的文件或package.d文件,就像您在具有模块名称的文件夹中一样。因此,如果你做import foo;,应该有一个名为foo.d或package.d的文件在一个名为foo的文件夹中,在它的开头有module foo;。我认为你所拥有的是正确的,但由于你的导入路径错误,dub正在寻找geometry.d或文件夹几何的错误位置。

旁注,您可以随时使用dub将要导入的文件夹转换为包。并运行dub add-local ./。然后,您可以通过执行"my-project": "~master"将其作为依赖项添加到其他项目

© www.soinside.com 2019 - 2024. All rights reserved.