如何使用 Ivy 发布本机库?
Posted
技术标签:
【中文标题】如何使用 Ivy 发布本机库?【英文标题】:How to publish native libraries with Ivy? 【发布时间】:2014-01-31 21:33:02 【问题描述】:对于 Java 库项目,要发布的工件很简单,因为输出是单个 jar 文件。但是,我还有一个项目要发布以下内容:
MyLib.jar armeabi/libStuff.so armeabi-v7a/libStuff.so mips/libStuff.so x86/libStuff.so我无法将所有这些 .so 文件设置为工件,因为它们都具有相同的名称。推荐的方式是什么?将所有内容放在一个 zip 中,让用户在构建之前使用 gradle(或 ant 或其他)解压缩它?我应该把 Jar 文件放在 zip 之外吗?此类工件是否有约定?
【问题讨论】:
【参考方案1】:使用 Ivy 管理许多“相同”工件(唯一不同的是架构)的最佳方式是使用 extra attributes。
所以在你的模块中你要声明:
<publications xmlns:e="http://ant.apache.org/ivy/extra">
<artifact name="MyLib" type="jar" ext="jar" />
<artifact name="libStuff" type="native" ext="so" e:arch="armeabi" />
<artifact name="libStuff" type="native" ext="so" e:arch="armeabi-v7a" />
<artifact name="libStuff" type="native" ext="so" e:arch="mips" />
<artifact name="libStuff" type="native" ext="so" e:arch="x86" />
</publications>
缺点是您围绕 Ivy 的整个链条都必须考虑该额外属性。例如,您应该能够配置您的存储库,使其接受像这样的自定义模式:
$repository.dir/[organisation]/[module]/[arch]/[revision]/[artifact].[ext]
正如您所提到的,另一种解决方案是使用 zip 文件夹。这可能是一个很好的时机,因为即将发布的 Ivy 2.4 通过packaging 支持压缩文件夹。
例如,您可以声明:
<publications xmlns:e="http://ant.apache.org/ivy/extra">
<artifact name="MyLib" type="jar" ext="jar" />
<artifact name="libStuff" type="natives" ext="zip" packaging="zip" />
</publications>
然后,Ivy 会将libStuff-1.2.3.zip
下载到它的缓存中,并会自动将其解压缩到缓存中的libStuff-1.2.3
文件夹中,您可以在其中找到您的多个本地库。
【讨论】:
非常感谢!实际上,我们正在尝试使用我们所有项目(java、c#、c、c++...)的工件来填充 Nexus 服务器,并且在某些项目中我们确实需要保留目录层次结构。因此,Ivy 的“打包”功能看起来真的很有趣!以上是关于如何使用 Ivy 发布本机库?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用自定义 gradle 插件而不将其发布到 maven/ivy 存储库?