Dart: относительный импорт, изменяющий структуру папок
У меня флаттер с деревом выглядит
...
├── lib
│ ├── UI
│ │ ├── base_widget.dart
│ │ ├── components
│ │ │ ├── card.dart
│ │ │ ├── centered_progressIndicator.dart
│ │ │ ├── gradient_button.dart
│ │ │ └── rounded_network_image.dart
│ │ ├── more
│ │ │ ├── announcements
│ │ │ │ └── announcements.dart
│ │ │ ├── more.dart
│ ├── main.dart
├── pubspec.lock
├── pubspec.yaml
└── test
└── widget_test.dart
В announcements.dart
(также в некоторых других файлах) Я хочу импортировать card.dart
, Теперь я импортирую как import '../../components/card.dart';
,
Если я поменяю имя components
каталог на что-то другое, я должен редактировать все файлы, куда я импортирую components/card.dart
,
Кроме того, я знаю относительный импорт с ../
не рекомендуется, следует использовать package:
,
У меня вопрос, как написать оператор импорта, который не влияет на изменения структуры каталогов? Это возможно в дартс?
2 ответа
Вы определенно должны иметь возможность использовать относительный импорт внутри вашего собственного пакета (и никогда в пакет или из него).
То есть я совершенно не согласен с:
Кроме того, я знаю, что относительный импорт с../ не рекомендуется, следует использовать package:.
Если вы переименуете каталог, содержащий много файлов, то все ссылки на эти файлы должны быть переписаны. Обойти это невозможно. Если вы используете относительные пути между файлами, то файлы внутри переименованного каталога, которые ссылаются друг на друга, не должны будут изменяться, потому что их пути импорта не будут содержать измененного имени. Если вы используете package:
Повсюду URI, их также нужно будет изменить.
любой package:
ссылки вне пакета, который нацелен на файл в переименованном каталоге, также должны быть изменены, поэтому, если переименованный каталог не находится под lib/src/
и, следовательно, не предназначен для прямого внешнего доступа, переименование является серьезным изменением. Вот почему рекомендуется помещать большинство исходных файлов в lib/src/
а затем реэкспортировать их из фиксированных библиотек, помещенных прямо в lib/
, Это делает его непоколебимым изменением для реструктуризации файлов под lib/src/
До тех пор, пока вы экспортируете одни и те же объявления в публичные библиотеки.
Такое переименование является большим рефакторингом, и наличие IDE поможет вам переименовать все ссылки, если оно поддерживает это.
package:
Импорт более устойчив к изменениям, чем относительный импорт, но вам понадобится помощь вашего редактора или IDE для переименования файла / каталога библиотеки. В VS Code вы можете использовать ctrl+shift+h
чтобы открыть строку проекта заменить. Это обычная функция редакторов и, вероятно, лучший способ изменить операторы импорта после переименования файла библиотеки.
Если вы используете VS Code, есть также dart-import, расширение для изменения всех ваших импортов на относительный к пакету синтаксис, а также может удалить неиспользуемый импорт.
Можно использовать импорт пакета. В файле ".packages" внутри вашего проекта добавьте "projectname/lib". Затем вы можете сделать следующий "пакет импорта: имя проекта / компоненты / карты"
Путь, добавленный в.packages, даст относительный путь к папке проекта lib.