在“.app”(应用程序包)中运行脚本作为主要可执行文件

时间:2013-01-31 08:10:25

标签: macos mono cross-platform

我正在尝试使用Mono制作适用于Windows,Mac和Linux的便携式应用程序,但我希望有一个标准的DMG文件,允许用户只需单击并将我的应用程序拖到他们的Applications文件夹中苹果电脑。在对this post的最佳答案中,我发现通过在#!文件夹中创建以MyAppName.app/Contents/MacOSX/开头的可执行脚本,它可以运行我喜欢的任何内容。

如何让脚本实际运行?

我在XCode中创建了一个空白的“Hello World”Cocoa应用程序,并将.app文件复制到了Applications目录,一切都运行良好。但是,当我用一个以#!开头的脚本替换MacOSX文件夹中的可执行文件时,它没有运行该脚本。

我尝试了chmod 755 myscript,我尝试删除旧的可执行文件并将我的脚本重命名为旧文件名,但所有这些操作都是让应用程序停止运行。脚本的权限和文件名都是正确的。

然后我假设可能脚本不起作用,并且XCoded命令行实用程序,再一次只是喷出“Hello World!”,但它仍然没有运行。

“.app”扩展名正式称为“应用程序包”,它们有一些相当不错的文档,但它们似乎都没有告诉我为什么我的方法不起作用。

Here is the .app bundle that I'm working on.在MasOSX目录中,您将找到hello(Hello Word命令行实用程序)和脚本(一行脚本,#!作为第一行)和XCodeTest(Hello World)可可app)。

1 个答案:

答案 0 :(得分:4)

Unix中的脚本

首先,脚本第一行的正确语法是

#! <path-to-script-interpreter> [<optional-args>]

例如

#! /usr/bin/perl -wT
... perl code here

使用open命令

但是,这对您没有帮助,因为open命令不支持将shell脚本作为启动程序。您需要编写一些C / Objective-C代码并将其编译为本机可执行文件。只需在该工具中使用system()execv()也无效,您必须dlopen() Mono运行时。

查看monodevelop/mainbuild/MacOSX/monostub.m的示例。这就是MonoDevelop用于启动MonoMac应用程序的目的。

当您使用XCode编写Cocoa应用程序时,它会将您的应用程序编译为本机代码,并将生成的二进制文件作为启动器放在Contents/MacOS目录中。

简单的解决方案

为什么不简单地使用MonoDevelop创建MonoMac应用程序?这会自动为您创建.app包 - 无需使用脚本或自定义启动器。