【问题标题】:How do I use compc to build a swc that dynamically links in Flex components?如何使用 compc 构建动态链接 Flex 组件的 swc?
【发布时间】:2012-06-17 15:56:39
【问题描述】:

在 Flash Builder 4.6 中,当管理 Flex 项目时,在 Flex 库项目的构建路径选项下,我可以在“外部”和“合并到代码”框架链接之间进行选择,默认为“外部”。

直接调用compc时如何使用外部链接?

似乎 compc 默认将 Flex 组件放在 library-path 部分而不是 external-library-path 部分(查看生成的 -dump-config 文件)。

似乎 Flash Builder 中可用的选项应该可以通过 compc 上的某个选项或通过某些参数组合访问。我查看了 compc 选项文档,但不幸的是空了。任何帮助将不胜感激。

【问题讨论】:

  • 为什么要这样做? “外部/合并到代码”实际上是运行时依赖项,SWC 没有运行时。创建使用 SWC 的 SWF 时,Flex 编译器会在创建 SWF 时自动优化掉未使用的类。
  • 我的目标是制作一个与具有各种 Flex 版本的客户端应用程序兼容的 SWC。例如,当我使用as3commons-logging SWC 时,它适用于 Flex 3.5 项目和 4.6 项目。这似乎是分发 SWC(带有外部 Flex 框架链接)的标准方式,并且是从 Flash Builder 构建时的默认方式。当 SWC 使用静态链接编译时,它会产生更大的 SWC,并且会导致新项目中的编译时错误。
  • @www.Flextras.com 我一直这样做:它使您的库更轻量级,如果您希望将它们用作 RSL,这一点很重要。无论如何,框架类都将由主应用程序加载,因此您无需在库中再次链接它们。我一直不明白为什么这不是 compc 的默认设置。

标签: apache-flex flex3 flash-builder swc compc


【解决方案1】:

首先查看flex-config.xml 文件。您可以在[flex_sdk_path]/frameworks/flex-config.xml 中找到它。现在找到名为runtime-shared-library-path 的节点。在这里,您将找到使用 compc 编译时将合并的所有库的列表(节点称为 runtime-shared-library-path,因为 RSL 是使用 mxmlc 时的默认链接)。这些是您需要在外部链接的文件。

您有两种选择:

  1. 创建您自己的配置文件,您可以在其中将所有runtime-shared-library-path 节点转换为external-library-path 节点。通过将-load-config=my-config.xml 添加到编译器命令来加载此文件而不是默认文件。
  2. 保留默认配置文件,但使用命令选项覆盖链接。只需将每个 swc 添加到外部库路径:-external-library-path+=libs/framework.swc 等等。

但是,当您使用 mxmlc 编译应用程序时,默认链接是 RSL。您可能也想覆盖它并使其“合并”。在这种情况下,您首先必须重置 RSL 路径:-runtime-shared-library-path=(没错,= 之后什么都没有)。然后将每个swc添加到-library-path:-library-path+=libs/framework.swc


或者(警告!在路上无耻的自我推销),您可以使用名为GradleFx 的构建工具。如果您只使用这一行创建构建文件:

type = 'swc'

它将使用外部链接的框架编译您的库。如果需要,您可以覆盖此默认值:

type = 'swc'
frameworkLinkage = 'merged'

【讨论】:

  • 感谢 RIAstar 的详细解答。我开始研究 flex-config.xml,因为在我看到您的回复之前,我意识到这是默认值的来源,但我不知道 -load-config 或究竟要更改哪些参数,所以我很感激推动正确的方向。让我探索您推荐的两个选项并报告我的进度。一旦我了解了如何自己安装 compc,我希望能够使用 GradleFx。从我检查出来的来看,看起来很整洁!
  • 这两个选项似乎都很好用!两个问题.. 唯一的障碍是 Flexrake 似乎养成了评估相对于 pwd 或被引用的配置文件的所有路径的习惯。这阻止了选项 2 对我来说开箱即用,因为 compc 抱怨 libs/framework.swc 不存在。幸运的是,我们的构建工具允许我们在 Flex SDK 路径中进行插值。你知道 Flex 内部的方法吗?此外,在我的实验中,清除-runtime-shared-library-path 似乎没有任何区别。这是预期的吗?
  • @StevenXu 1) 我一直使用绝对路径;我不认为编译器可以做你想做的事。 2)你是对的,我的小错误:如果你想合并框架而不是 rsl-linking 它与 mxmlc,则需要清除 rsl-path,compc 不需要。我想您宁愿清除 library-path,但将 swcs 放在外部库路径上似乎已经取代了它。
  • @StevenXu BTW,这个 Flexrake 是什么?我一直在尝试查找有关它的信息,但找不到任何信息。
  • 感谢您阐明工作中的生态系统。我不是 100% 了解所有配置设置的语义,但现在它变得更有意义了。 RE:Flexrake,抱歉我打错了。我的意思是说 Flex :)。我把这个名字和我们的一个构建工具混在一起了!
猜你喜欢
  • 1970-01-01
  • 2010-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-11
  • 2010-09-12
  • 2011-04-21
  • 2010-11-26
相关资源
最近更新 更多