如何从同一个包中导入库?

时间:2013-04-21 19:47:47

标签: dart

飞镖页面http://pub.dartlang.org/doc/#adding-a-dependency描述了如何使用'import“包从其自己的包中导入dart文件( parser_test.dart ):... “导入方式。这似乎意味着这是一件好事 - 比使用相对路径更好。显示的示例适用于 test 中的文件,该文件看起来很特殊。但是,为什么从包中的lib导入相同的包 lib文件没有意义。也许它确实有意义,但如果是这样的话,那么 pub update 并不方便。

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_1 foo_lib_2.dart 有两个选项:

  • import“../ foo_lib_1.dart”;
  • import“packages:foo / foo_lib_1.dart”;

我的猜测建议的方法是第一个驻留在 lib 下的导入。我认为这是 pub update 的原因似乎是在 bin test <的任何 packages 文件夹中自动提供软链接/ em>,或示例 foo ,例如 foo - &gt; ../ LIB 。但是,对于顶级 foo 中的 packages 文件夹,它不会这样做。这意味着要将第二种类型的导入(即包导入)用于您需要添加的工作:

foo:
  path: lib

pubspec.yaml foo 的依赖关系。库使用包样式导入来导入另一个库(不在 test bin 示例中)是否有任何优点或缺点从它自己的包?是否有明显不一致的原因?


在接受下面的答案后,我仍然没有看到它。这是我在shell会话中看到的内容,我想将此行为与答案进行协调。任何解释都表示赞赏。我使用的是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

1 个答案:

答案 0 :(得分:3)

实际上,您绝对可以使用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目录本身中,你想说这两个库虽然可能相互依赖,但可以分开存在,不受其物理位置的约束。

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