gpt4 book ai didi

dart - 如何让库从同一个包导入库?

转载 作者:行者123 更新时间:2023-12-02 20:39:58 24 4
gpt4 key购买 nike

Dart 页面 http://pub.dartlang.org/doc/#adding-a-dependency描述如何让 dart 文件 (parser_test.dart) 使用 'import "package:..." 导入样式从其自己的包中导入文件。这似乎暗示这是一件好事——比使用相对路径更好。显示的此示例适用于 test 中的一个文件,该文件似乎很特殊。但是,为什么从包中的 lib 导入同一个包 lib 文件没有意义。也许它确实有意义,但如果是这样,pub 更新 并不会让它变得方便。

foo/
/lib/
foo_lib_1.dart
foo_lib_2.dart
src/
foo_lib_1/
foo_lib_1_impl.dart
foo_lib_2/
foo_lib_2_impl.dart

假设foo_lib_2使用foo_lib_1foo_lib_2.dart 有两个选项:

  • 导入“../foo_lib_1.dart”;
  • 导入“packages:foo/foo_lib_1.dart”;

我的猜测是建议方法是驻留在lib下的任何此类导入的第一个方法。我认为这是 pub update 的原因似乎会自动在 bintest< 的 packages 文件夹中提供软链接(soft link)/em>,或示例foo,例如foo -> ../lib。然而,它不会对顶级 foo 中的 packages 文件夹执行相同的操作。这意味着要使第二种类型的导入(即包导入)起作用,您需要添加:

foo:
path: lib

pubspec.yamlfoo 的依赖项。一个库使用包样式导入导入另一个库(不是在 testbinexample 中)是否有任何优点或缺点从它自己的包中?明显的不一致是否有原因?

<小时/>

接受下面的答案后,我仍然没有看到它。这是我在 shell session 中看到的内容,我想使这种行为与答案相一致。任何解释表示赞赏。我使用 emacs 而不是 DartEditor,因此这里使用的是老式命令行方法。

### Show all files, one dart library file and one yaml, plus empty
### lib and test folders

user@user-thinkpad:/tmp/uml_codegen_sample$ ls -R
.:
lib pubspec.yaml test

./lib:
plusauri.dart

./test:

### Show contents of pubspec

user@user-thinkpad:/tmp/uml_codegen_sample$ cat pubspec.yaml
name: domain_model
version: 0.0.1
description: >
Auto-generated support from /home/user/plusauri/modeling/plusauri.xmi.json
dependencies:
ebisu:
path: /home/user/open_source/codegen/dart/ebisu

### Run pub install and show the changes. Note there is a soft
### link to packages from test, but not lib.

user@user-thinkpad:/tmp/uml_codegen_sample$ pub install
Resolving dependencies...
Dependencies installed!
Some packages that were installed are not compatible with your SDK version 0.4.7+5.r21658 and may not work:
- 'pathos' requires >=0.5.0+1

You may be able to resolve this by upgrading to the latest Dart SDK
or adding a version constraint to use an older version of a package.
user@user-thinkpad:/tmp/uml_codegen_sample$ ls -R
.:
lib packages pubspec.lock pubspec.yaml test

./lib:
plusauri.dart

./packages:
domain_model ebisu pathos

./test:
packages

### Note here the program does not work, and suspiciously pub
### install put no packages link under lib like it did test

user@user-thinkpad:/tmp/uml_codegen_sample$ dart lib/plusauri.dart
Unable to open file: /tmp/uml_codegen_sample/lib/packages/ebisu/ebisu_utils.dart'file:///tmp/uml_codegen_sample/lib/plusauri.dart': Error: line 5 pos 1: library handler failed
import "package:ebisu/ebisu_utils.dart" as EBISU_UTILS;
^

### Copy the same dart file to test to show that it can run there
### just fine

user@user-thinkpad:/tmp/uml_codegen_sample$ cp lib/plusauri.dart test/
user@user-thinkpad:/tmp/uml_codegen_sample$ dart test/plusauri.dart
Main for library plusauri
user@user-thinkpad:/tmp/uml_codegen_sample$

### Finally, manually create the soft link in lib, to show it will
### then run

user@user-thinkpad:/tmp/uml_codegen_sample$ ln -s ../packages lib/packages
user@user-thinkpad:/tmp/uml_codegen_sample$ dart lib/plusauri.dart
Main for library plusauri

最佳答案

实际上,您绝对可以使用 package:foo/foo_lib_1.dart 语法进行导入,而无需更改 pubspec.yaml 甚至创建 pubspec。首先是 yaml!

你可以看到,从语言层面来说这是正确的,在这个测试中:https://github.com/dart-lang/bleeding_edge/blob/master/dart/tests/standalone/package/packages/package1.dart

野外的一个例子是:https://github.com/kevmoo/hop.dart/blob/master/lib/hop_tasks.dart#L17

<小时/>

我不认为以某种方式编写有任何好处,只是编写相对路径稍微短一些。

从项目结构的角度来看,当我深入到不会向用户公开的子目录时,我会使用相对路径导入。 src 通常被视为外部用户看不到的具体实现细节,因此请使用您想要的内容的相对路径。

但是,如果您在多个目录中工作,那么您应该使用 package: 导入来强化各个部分是独立且可互换的这一理念。在 lib 目录本身中,您想说这两个库虽然可能相互依赖,但可以单独存在并且不受其物理位置的约束。

我建议不要在导入中使用 ../,因为它很脆弱,并且如果/当您修改目录结构或部署时可能会以奇怪的方式损坏。

关于dart - 如何让库从同一个包导入库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16135458/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com