Попытка импортировать некоторые модули, но получить "... который не может быть прочитан" - PullRequest
0 голосов
/ 26 января 2019

Я новичок в 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, он продолжает давать сбой:

dub build --force

Неверный источник / путь импорта: / home / iposthuman / Документы / Разработка / D / Ranger / examples / template0 / ~ / Документы / Разработка / D / Ranger / source

Выполнение «отладочной» сборки с использованием /home/iposthuman/dlang/dmd-2.084.0/linux/bin64/dmd для x86_64.

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 будет настолько сложным, просто чтобы заставить что-то работать. Я искал повсюду на Модулях и нашел только тривиальные примеры.

Спасибо.

Ответы [ 2 ]

0 голосов
/ 26 февраля 2019

Я думаю, что ответ 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;. Я думаю, что то, что у вас есть, правильно, но поскольку ваш путь импорта неверен, даб ищет неправильное место для geometry.d или геометрии папки.

Примечание: вы всегда можете превратить импортируемую папку в пакет, используя dub. И запустить dub add-local ./. Затем вы можете добавить его в качестве зависимости к другому проекту, выполнив "my-project": "~master"

0 голосов
/ 26 января 2019

Dub не переводит ~ в ваш домашний каталог.~ говорит по POSIX, но dub - это кроссплатформенное приложение.

Либо используйте /home/iposthuman/Documents/Development/D/Ranger/source, либо ../../source.

Желательно последнее, потому что оно не сломается, когдаваше имя пользователя изменится, или вы поделитесь своим проектом с кем-то еще.

...