我有一个Gnome GJS应用程序,想用Meson打包。
应用程序的源代码(在.src中)有lib、object和ui等子文件夹。
每个子文件夹都有一个meson.build文件,看起来像这样(针对.srclib文件夹)。
app_resource = gnome.compile_resources(app_id + 'src.lib',
app_id + '.lib.gresource.xml',
source_dir: '.',
gresource_bundle: true,
install: true,
install_dir : pkgdatadir)
和一个gresource xml文件,看起来像这样(也是针对.srclib文件夹)。
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/com/domain/app/js">
<file>aes.js</file>
<file>file.js</file>
<file>settings.js</file>
<file>table.js</file>
<file>template.js</file>
</gresource>
</gresources>
在.src文件夹里我有一个com.domain.app.in文件,像这样。
#!@GJS@
imports.package.init({ name: "com.domain.app",
version: "@PACKAGE_VERSION@",
prefix: "@prefix@",
libdir: "@libdir@" });
imports.package.run(imports.main);
meson.build文件是这样的
app_resource = gnome.compile_resources(app_id + '.src',
app_id + '.src.gresource.xml',
source_dir: '.',
gresource_bundle: true,
install: true,
install_dir : pkgdatadir)
app_launcher = configure_file(
output : app_id,
input : app_id + '.in',
configuration: app_configuration)
install_data(app_launcher,
install_dir: get_option('bindir'),
install_mode: 'rwxr-xr-x'
)
和一个像这样的gresource xml文件。
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/com/domain/app/src">
<file>main.js</file>
</gresource>
</gresources>
项目根目录下的meson.build主文件是这样的:
project('app', 'c',
version: '0.1.0',
meson_version: '>= 0.50.0',
)
app_command = 'app'
app_id = 'com.domain.app'
gnome = import('gnome')
intl = import('i18n')
config_h = configuration_data()
GETTEXT_PACKAGE = app_id
config_h.set_quoted('GETTEXT_PACKAGE', GETTEXT_PACKAGE)
config_h.set_quoted('LOCALEDIR', join_paths(get_option('prefix'), get_option('localedir')))
configure_file(
output: 'config.h',
configuration: config_h,
)
add_global_arguments([
'-DHAVE_CONFIG_H',
'-I' + meson.build_root(),
], language: 'c')
app_configuration = configuration_data()
app_configuration.set('GJS', find_program('gjs').path())
app_configuration.set('PACKAGE_NAME', app_id)
app_configuration.set('PACKAGE_VERSION', meson.project_version())
app_configuration.set('prefix', get_option('prefix'))
pkgdatadir = join_paths(get_option('datadir'), app_id)
app_configuration.set('libdir', join_paths(get_option('prefix'), get_option('libdir')))
app_configuration.set('pkgdatadir', pkgdatadir)
subdir('src')
subdir('src/lib')
subdir('src/ui')
subdir('src/object')
subdir('data')
subdir('po')
meson.add_install_script('meson/meson_post_install.py')
所以...
当我运行 meson builddir
meson似乎很满意,没有给出任何错误。它确实填充了builddir,但没有任何明显有用的东西。
然后我cd到builddir并运行ninja,ninja似乎没有做什么,我仍然没有任何可执行文件。
感谢Andy的评论,我运行了 meson install
(有一堆本地文件夹的测试参数),确实得到了一些文件,包括一个可执行文件。
但是,当我试图从终端运行可执行文件时,我得到以下错误。
(com.domain.app:6420): Gjs-WARNING **: 21:27:05.765: JS ERROR: ImportError: No JS module 'main' found in search path
@./com.domain.app:6:1
main.js是应用程序src文件夹中的一个文件。它在同一文件夹的gresource xml文件中被引用。
我到底做错了什么或者遗漏了什么?
任何提示都将是非常感激的。
我想 main.js
在错误的目录中,或者你对它的引用不正确。下面你尝试导入 main
归根 imports
:
#!@GJS@
imports.package.init({ name: "com.domain.app",
version: "@PACKAGE_VERSION@",
prefix: "@prefix@",
libdir: "@libdir@" });
imports.package.run(imports.main);
然而,在你的GResource中, prefix
把它 src
:
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/com/domain/app/src">
<file>main.js</file>
</gresource>
</gresources>
原则上,你要么需要改变 imports.main
到 imports.src.main
或改变 /com/domain/app/src
到 /com/domain/app
. 然而,在实践中,我认为所有的JavaScript源码都需要在下面的 /com/domain/app/js
前缀,所以可能应该是 /com/domain/app/js
和 imports.main
.
引用来源 GNOME 天气 和 package.js
可能会有很大的帮助。