Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add mechanism to install binary package from archive #1338

Closed
xq114 opened this issue Apr 13, 2021 · 9 comments
Closed

Add mechanism to install binary package from archive #1338

xq114 opened this issue Apr 13, 2021 · 9 comments

Comments

@xq114
Copy link
Contributor

xq114 commented Apr 13, 2021

你在什么场景下需要该功能?

某些包由于网络环境、编译速度等原因不太方便从xmake-repo安装(remote resource无法连接、构建中途需要下载数据等等),希望已经安装了此包的用户能打成离线包传给网络不佳的用户安装。

使用localpkg也是一种办法,但这样就必须在xmake.lua里面add_requires的时候加判断、让用户输入本地包放置位置、每个项目都要重新指定一遍,非常麻烦

描述可能的解决方案

把包安装后的的manifest.txt等文件打包成一个压缩文件(例如opencv-4.5.2.zip),执行

xrepo install ./opencv-4.5.2.zip

则把文件解压到对应位置,如果存在manifest.txt,初始化references.txt,将包与从xmake-repo中下载的包一并处理。在写

add_requires("opencv")

时自动引用离线安装的包

描述你认为的候选方案

或者不压缩,

xrepo install ./opencv-4.5.2/
@waruqi
Copy link
Member

waruqi commented Apr 13, 2021

一种办法,吧构建这些包过程中所有用到需要下载的包,从 cache 目录下提取下载的原始tar包到一个 固定目录,比如 packages_tarball(不需要目录结构,按原样下载名放置即可,名字不知道,可以 xmake require --info 查看 search names/dirs)

然后打包发给其他用户,然后对方机器上通过下面的命令,指定tar搜索目录,比如

xmake g --pkg_searchdirs=/xxxx/packages_tarball

这个时候,不过对方原样使用 add_requires 还是走 xrepo 。。都会优先从这个本地目录下 找寻所有 tar 包,直接解压编译安装,完全离线的。。

所以用户对 工程xmake.lua 不用做任何改动,你发给它,也仅仅只是个 汇总了所有原始 tar 包的整个目录包 packages_tarball 给它。。也很方便,这原本就是支持的,本地包搜索目录可以设置多个,原本就是用于无网和弱网环境

@xq114
Copy link
Contributor Author

xq114 commented Apr 13, 2021

一种办法,吧构建这些包过程中所有用到需要下载的包,从 cache 目录下提取下载的原始tar包到一个 固定目录,比如 packages_tarball(不需要目录结构,按原样下载名放置即可,名字不知道,可以 xmake require --info 查看 search names/dirs)

然后打包发给其他用户,然后对方机器上通过下面的命令,指定tar搜索目录,比如

xmake g --pkg_searchdirs=/xxxx/packages_tarball

这个时候,不过对方原样使用 add_requires 还是走 xrepo 。。都会优先从这个本地目录下 找寻所有 tar 包,直接解压编译安装,完全离线的。。

所以用户对 工程xmake.lua 不用做任何改动,你发给它,也仅仅只是个 汇总了所有原始 tar 包的整个目录包 packages_tarball 给它。。也很方便,这原本就是支持的,本地包搜索目录可以设置多个,原本就是用于无网和弱网环境

这个有缺陷的,一个是除了网络问题还有编译时间问题,有些包可能编译时间过长,编译期间会占满cpu几个小时,这样影响到工作;第二是除了下载的tarball还有resource,甚至有的包会在CMakeLists.txt里面自己封装网络接口下载文件,仅仅解决tarball下载的问题并不足够

@waruqi
Copy link
Member

waruqi commented Apr 13, 2021

那就自己 export 导出装好的包 ,再放回对方 packages安装目录 就行了

@xq114
Copy link
Contributor Author

xq114 commented Apr 13, 2021

那就自己 export 导出装好的包 ,再放回对方 packages安装目录 就行了

对,就是这样,xmake放package的路径默认是隐藏的而且带有一串hash,所以需要一个从manifest生成hash并安装到package安装目录的api,这样对新用户更友好,解释起来也方便

@waruqi
Copy link
Member

waruqi commented Apr 13, 2021

不需要重新生成,整个带hash目录结构原样打包copy过去就行了

@x1244
Copy link
Contributor

x1244 commented Apr 13, 2021

将xrepo export的包放入一个目录,在xmake.lua引用不成功呢。

add_packagedirs("F:/package")
add_requires("zlib", "spdlog")
target("pkg")
    set_kind("binary")
    add_files("src/pkg.cpp")
    add_packages("zlib", "spdlog")

xmake f -c时提示要安装包

PS C:\workspace\xm> xmake f -c
checking for platform ... windows
checking for architecture ... x64
checking for Microsoft Visual Studio (x64) version ... 2019
note: try installing these packages (pass -y to skip confirm)?
in xmake-repo:
  -> spdlog v1.8.5
please input: y (y/n)

拷贝目录

PS C:\workspace\xm> ls f:/package


    目录: F:\package


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d-----         2021/4/14      6:52                spdlog_v1.8.5_3a6d86bc05784bc69ad7f92fea34de2c
d-----         2021/4/14      6:52                zlib_1.2.11_a593fa3f71e64cf790ec96898b34de8a

能否提供一个xrepo import命令,将export生成的包导入到另外的机器中呢?
可以看下我在xrepo中提的一个issues, #6

@xq114
Copy link
Contributor Author

xq114 commented Apr 14, 2021

还有一种需求是用户自己修改了第三方包的源码,想要用修改的第三方包代替原始的第三方包编译并与原始对比。如果支持安装本地包则可以用户手写manifest.txt来生成包供xrepo安装,而无需改动构建文件xmake.lua

@waruqi
Copy link
Member

waruqi commented Apr 14, 2021

export/import 可以搞,manifest属于内部文件,不对外开放,安装本地包 不走源码编译,就是 import ,走源码编译本地按装,同样有 on_install内部网络问题

@waruqi waruqi added this to the v2.5.4 milestone Apr 14, 2021
@waruqi
Copy link
Member

waruqi commented Apr 14, 2021

我加上 import 支持了,并且改进了 export

导出导入当前项目 add_requires() 配置的所有包,需要进入特定 xmake 项目

$ xrepo export -o /xxx/packagedir
$ xrepo import -i /xxx/packagedir

导出导入特定包,不依赖当前项目

$ xrepo export -o /xxx/packagedir zlib
$ xrepo import -i /xxx/packagedir zlib

目前是整包目录输出,我就不归档了,自己压缩下分发,也要不了多少时间

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants