如何让库从同一个包中导入库?
Posted
技术标签:
【中文标题】如何让库从同一个包中导入库?【英文标题】:how to have libraries import libraries from the same package? 【发布时间】:2013-04-14 16:00:44 【问题描述】:dart 页面http://pub.dartlang.org/doc/#adding-a-dependency 描述了如何使用 'import "package:..." 让 dart 文件 (parser_test.dart) 从其自己的包中导入文件 /em> 导入样式。这似乎暗示这是一件好事 - 比使用相对路径更好。这个例子是针对 test 中的一个文件,它看起来很特殊。但是,为什么从包中的 lib 导入 same package 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_1。 foo_lib_2.dart有两个选项:
导入“../foo_lib_1.dart”; 导入“packages:foo/foo_lib_1.dart”;我的猜测是 suggested 方法是任何驻留在 lib 下的此类导入的第一种方法。我认为这是 pub update 的原因似乎自动在 bin、testpackages 文件夹中提供软链接/em>,或 example 到 foo,例如 foo -> ../lib。然而,对于*** foo 中的 packages 文件夹,它并没有做同样的事情。这意味着您需要添加第二种类型的导入(即包导入):
foo:
path: lib
到 pubspec.yaml 中 foo 的依赖项。一个库使用包样式导入导入另一个库(不在test、bin或example中)有什么优点或缺点吗?从它自己的包?明显的不一致是否有原因?
接受下面的答案后,我仍然没有看到它。这是我在 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
【问题讨论】:
很高兴我找到了这个。我不知道如何使用“包”从同一个项目导入,并且使用 2 个不同的路径来导入同一个文件(其中一个添加了相对的“../”)导致同一个文件的 2 个副本浮动在我的程序命名空间中。 (我无法在示例项目中复制的错误)。谢谢。 【参考方案1】:实际上,您绝对可以使用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 目录本身中,您想说这两个库虽然可能相互依赖,但可以独立存在并且不受其物理位置的限制。
我建议不要在您的导入中使用 ../
,因为它很脆弱,并且在您修改目录结构或部署时可能会以奇怪的方式中断。
【讨论】:
现在很清楚了。我认为即使是图书馆也可以有一个主要的图书馆之旅或文档之一。所以,如果我有一个库可以做一件事,比如解析一种文件,我会编写代码并将其转换为脚本,也可以通过添加文件的主要接受参数来解析。这就是为什么它对我来说失败了 - lib 下没有包文件夹(但相对导入工作正常)。也许教训是不要仅仅因为可以就将库作为二进制文件加倍。 这清除了本应在语言之旅或“优雅飞镖”中出现的内容以上是关于如何让库从同一个包中导入库?的主要内容,如果未能解决你的问题,请参考以下文章