【问题标题】:Meteor 1.2 share files between packagesMeteor 1.2 在包之间共享文件
【发布时间】:2016-02-11 02:40:46
【问题描述】:

Meteor 1.2 中有没有办法在包之间共享文件?

我想要做的是有一个 /private/bower_components/* 文件夹,该文件夹由项目中的所有包共享。这实现了两件事:

  • 无需为每个包执行bower install
  • 如果包共享相同的库,则消除重复项

对于如何实现上述 2 个目标,如有任何想法或建议,我将不胜感激。

我之前在 Meteor 1.1 中能够做到的事情

在我的 package.js 文件中,我将拥有:

api.addFiles([
    '../../private/bower_components/bootstrap/dist/js/bootstrap.min.js',
],'client');

但是,在 Meteor 1.2 中,这会产生错误 Error: Path contains forbidden segment '..',正如所讨论的 here

备注

我专门使用 bower 而不是流星包,因为我不想包含库中的所有文件。例如。对于 bootstrap,我使用自定义 bootstrap.less 文件,因此我只需要该库中的 bootstrap.js 文件。

艰难的道路

我能想到的唯一其他方法是:

  • 为每个库创建一个自定义的流星包,并从其他包中引用这些包。这意味着我必须为每个依赖项维护一个包,这太可怕了。
  • 直接在我的流星 html 模板的head 部分引用文件。这意味着我需要在项目文件中引用包依赖项的文件,这将创建一个依赖关系蜘蛛网;这并不理想。

[EDIT]下面的详细解释

我简化了上面的问题以突出我的问题;但是,以下内容使我收到的回复更加清晰。

当前结构

private
  └ bower_components
      └ bootstrap
      └ jquery
      └ ...
packages
  └ boilerplate
      └ boilerplate.less
  └ ...

我将 bower_components 设置为私有,这样所有文件就不会自动捆绑到流星构建中,从而导致不必要的膨胀。

boilerplate.less

...
@bootstrap-root: "/private/bower_components/bootstrap";
@import "@{bootstrap-root}/less/mixins.less";
@import "@{bootstrap-root}/less/buttons.less";
...

这不会立即起作用,因为根据最新的流星 less package documentation** 我需要在我的 package.js 文件 api.addFiles('x.less', 'client', {isImport: true}) 中专门包含较少的导入文件,否则我会收到错误:

While processing files with less (for target web.browser):
packages/boilerplate/boilerplate.less:6: Unknown import:
/private/bower_components/bootstrap/less/buttons.less

...这导致我的问题是我需要能够做到这一点才能使其工作...

...
api.addFiles([
    '../../private/bower_components/bootstrap/less/buttons.less',
],'client',{isImport: true});
...

** 是的,还有 2 种其他方法可以导入更少的文件,但我不想运行 grunt 只是为了更改通过 bower 安装的文件以在文件名中包含导入或将更少的文件分组为“进口”文件夹。正如我在 Meteor 1.1 中所说的那样,这只是在没有咕噜声的情况下工作 - 感觉就像 Meteor 在这里倒退了。

【问题讨论】:

  • 如何创建一个导出所需符号的基础包并将其添加为依赖项?
  • @MasterAM 不幸的是,需要导入的不仅仅是 js 文件;虽然那是我给出的例子。它包括您可能在 bower 包中找到的任何文件(js、css、less 等)
  • 但是这些应该包含在构建步骤中并捆绑在一起。需要less包的包需要编译less文件,捆绑css(不影响JS),JS文件在需要包之前加载,导出的符号可用于它。使用这种方法时你缺少什么?
  • @MasterAM 也许你可以多解释一下你的建议,拜托。我已经更详细地更新了我的问题......目前,我将 bower_components 放在私有文件夹中并直接从那里引用它们,以便只有我需要的内容被加载到包中。要么添加不必要的复杂性以仅包含选定的文件(与流星一起咕噜咕噜 - 呸),要么添加所有文件会创建一个非常大的臃肿包。在 1.1 中它刚刚工作:(
  • 我的建议几乎是多包之一(困难方式#1)。我知道这很烦人,但是根据包目录之外的相对路径中可用的文件,在流星包可分发性的上下文中并不是很有用。您是否尝试过符号链接?

标签: meteor


【解决方案1】:

经过一天多的尝试使其工作,包括:

  • 使用gulp将文件从private目录拉出到app项目根目录下,发现还是需要在包中导入。当这不起作用时,我尝试按照文档中的说明将它们放在 imports 目录中,但这也不起作用。
  • 未能成功地将 bower_components 移动到包目录中以在包中引用它们,然后希望通过 package.js 中的 imply() 公开它们
  • 开始使用api.addFiles('x.less', 'client', {isImport: true}) 导入较少文件以在我的包中使用。在意识到我必须为超过 50 个文件执行此操作后放弃,因为导入引导程序等使用的数量较少;而且我不知道每次我更新 bower 包时这会对未来产生什么影响。
  • 使用导入文件夹,以便自动导入“仅导入”较少的文件,而无需使用api.addFiles('x.less', 'client', {isImport: true})。我无法按照文档中的说明进行操作。

我偶然发现了以下链接:

这些链接以及我一直遇到的问题让我相信 Meteor 1.2 还没有为开发做好准备,更不用说生产了。

出于这个原因,我决定降级回 Meteor V1.1。希望我能在不久的将来再次重温这一点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-09-12
    • 1970-01-01
    • 2015-09-21
    • 2019-04-02
    • 1970-01-01
    • 2022-08-14
    • 1970-01-01
    相关资源
    最近更新 更多