【问题标题】:Run script in ".app" (Application Bundle) as the primary executable在“.app”(应用程序包)中运行脚本作为主要可执行文件
【发布时间】:2013-08-08 22:55:14
【问题描述】:

我正在尝试使用 Mono 制作可在 Windows、Mac 和 Linux 上运行的便携式应用程序,但我想要一个标准 DMG 文件,允许用户简单地单击我的应用程序并将其拖动到他们的应用程序文件夹中苹果电脑。在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 可可应用程序)。

【问题讨论】:

标签: macos mono cross-platform


【解决方案1】:

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 包 - 无需摆弄脚本或自定义启动器。

【讨论】:

  • 很棒的答案。这解决了我需要的一切。尤其是最后一段。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-20
  • 2021-07-22
  • 2020-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多