如何在macOS上安装Mono以使终端中的mono正常工作?

68

我正在尝试在Mac(OS X 10.10.5版本)上安装Mono,虽然安装过程提示已成功完成,但我无法从终端调用mono。

为了安装它,我以root身份运行了uninstallMono.sh以确保没有任何残留文件,然后运行了MonoFramework-MDK-4.0.4.1.macos10.xamarin.x86.pkg。安装程序似乎成功完成,但尝试调用mono却返回以下错误信息:

-bash: mono: command not found

Mono框架似乎已经安装好了:

Lees-Mac-Pro:Downloads kevinmack$ cd /Volumes/Macintosh\ HD/Library/Frameworks/
Lees-Mac-Pro:Frameworks kevinmack$ ls -l
total 32
lrwxr-xr-x  1 root  wheel   71 Jan 20  2015 AEProfiling.framework -> ../../Applications/Motion.app/Contents/Frameworks/AEProfiling.framework
lrwxr-xr-x  1 root  wheel   74 Jan 20  2015 AERegistration.framework -> ../../Applications/Motion.app/Contents/Frameworks/AERegistration.framework
lrwxr-xr-x  1 root  wheel   74 Jan 20  2015 AudioMixEngine.framework -> ../../Applications/Motion.app/Contents/Frameworks/AudioMixEngine.framework
drwxr-xr-x  8 root  admin  272 Sep 12 11:24 Mono.framework
lrwxr-xr-x  1 root  wheel   60 Sep  9 22:16 NyxAudioAnalysis.framework -> /System/Library/PrivateFrameworks/NyxAudioAnalysis.framework
drwxr-xr-x  5 root  wheel  170 Jan 20  2015 PluginManager.framework
drwxr-xr-x  8 root  wheel  272 Sep  9 22:19 iTunesLibrary.framework

...但是它不在/usr/bin中,尝试使用which mono查找其可执行文件返回空。

9个回答

105
在OS X El Capitan中,在终端中运行以下命令以支持mono命令。
export PATH=/Library/Frameworks/Mono.framework/Versions/Current/bin/:${PATH}

4
如果你不想每次打开终端都要输入那一行命令,那就将该行命令添加到你的主目录下的.bash_profile文件中。这假定你仍在使用bash,如果你已经更改了你的shell,那么你已经知道如何设置新的shell了。 - zanedp
1
并且在一年后的2018年4月仍然有效。将其添加到.bash_profile文件中是正确的方法。 - Juniper Jones

44

更新(因为这篇文章两年后仍然被浏览):

Mono的最新版本(5.x)安装过程会在/etc/paths.d目录下创建一个文件(mono-commands),其中包含以下路径:

/Library/Frameworks/Mono.framework/Versions/Current/Commands

因为新版本的mono符合“El Capitan”的要求,不再安装任何内容到/usr/bin中,因此现在使用/usr/local/bin。我不确定哪个mono 4.x版本引入了这个更改...

但我想你的路径中可能没有/usr/local/bin,可以尝试以下命令:

export PATH=/usr/local/bin:${PATH}
which mono
which mcs

在我的情况下,我安装了4.2.0版本:

$ which mono
/usr/local/bin/mono
$ which mcs
/usr/local/bin/mcs
$ mono --version
Mono JIT compiler version 4.2.0 (explicit/2701b19 Mon Aug 31 09:57:28 EDT 2015)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
$ cat `which mcs`
#!/bin/sh
export PATH=$PATH:/Library/Frameworks/Mono.framework/Versions/4.2.0/bin
export PKG_CONFIG_PATH=/Library/Frameworks/Mono.framework/External/pkgconfig:/Library/Frameworks/Mono.framework/Versions/4.2.0/lib/pkgconfig:/Library/Frameworks/Mono.framework/Versions/4.2.0/share/pkgconfig:$PKG_CONFIG_PATH
exec /Library/Frameworks/Mono.framework/Versions/4.2.0/bin/mono $MONO_OPTIONS /Library/Frameworks/Mono.framework/Versions/4.2.0/lib/mono/4.5/mcs.exe "$@"

2
这实际上是非常正确的。在我的机器上根本不存在usr/local/bin。创建它并在usr/local上调用chmod 777,然后重新安装mono即可解决问题。以前,mono尝试安装到usr/local/bin,并在找不到目标目录时静默失败。谢谢! - Kevin Mack
应该只有一个名为“Current”的文件夹,它将指向您最新的版本,而不是特定指定4.2.0版本。/Library/Frameworks/Mono.framework/Versions/Current/bin 对吗? - NovaJoe
正确,**/Library/Frameworks/Mono.framework/Versions/Current** 只是指向 Mono 框架中最新版本的符号链接。各种安装脚本实际上直接分配“带版本的路径”。 - SushiHangover
因此,mono 的完整路径是 /Library/Frameworks/Mono.framework/Versions/Current/bin/mono,对吗? - Aaron Franke
我已经安装了Mono 5.10,命令行中工作得很完美,但我编写了一个在Mac上运行并使用Mono的Java应用程序,但给我以下错误:需要安装Mono Framework。我已将Mono的命令和bin文件夹添加到路径中,但似乎Mono在终端外部不可访问。 - iltaf khalid
显示剩余2条评论

14

最好使用下一个导出命令:

export PATH=$PATH:/Library/Frameworks/Mono.framework/Versions/Current/bin/

  1. 不要修改PATH的旧顺序(这非常重要!)
  2. 您将使用当前版本(更新版本时,不需要更改变量PATH)

另一个选项(最佳选项)是在文件 /etc/paths 的末尾包含一行新内容: /Library/Frameworks/Mono.framework/Versions/Current/bin

在这种情况下,路径将对系统上的所有用户都可用。


1
谢谢你的回答。这帮助我找到了是什么在我的 .zshrc 和任何已经被引用的文件之外修改了我的 $PATH。 - Ben Kane

11

在使用 brew cask 安装 Mono 框架之后,我发现原来的 brew 也提供了 Mono!

于是我先卸载了 Mono。

$ brew cask uninstall mono-mdk

使用brew install mono安装它并移除所有在~/.zshrc中的配置更改。

看起来要好得多:

$ type mono
mono is /usr/local/bin/mono

$ mono --version
Mono JIT compiler version 4.6.2 (Stable 4.6.2.7/08fd525 Tue Nov 22 22:05:18 GMT 2016)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           normal
    SIGSEGV:       altstack
    Notification:  kqueue
    Architecture:  amd64
    Disabled:      none
    Misc:          softdebug
    LLVM:          supported, not enabled.
    GC:            sgen

我最初使用brew cask安装了Mono Framework,并需要将/Library/Frameworks/Mono.framework/Home/bin添加到PATH环境变量中。


$ brew cask info mono-mdk
mono-mdk: 4.6.2.7
http://www.mono-project.com/
Not installed
From: https://github.com/caskroom/homebrew-cask/blob/master/Casks/mono-mdk.rb
==> Name
Mono
==> Artifacts
MonoFramework-MDK-4.6.2.7.macos10.xamarin.universal.pkg (pkg)
➜  kafunk git:(master) brew cask install mono-mdk
==> Downloading https://download.mono-project.com/archive/4.6.2/macos-10-universal/MonoFramework-MDK-4.6.2.7.macos10.xamarin.universal.pkg
######################################################################## 100,0%
==> Verifying checksum for Cask mono-mdk
==> Running installer for mono-mdk; your password may be necessary.
==> Package installers may write to any location; options such as --appdir are ignored.
Password:
==> installer: Package name is Mono Framework
==> installer: Installing at base path /
==> installer: The install was successful.
  mono-mdk was successfully installed!

由于我使用 oh-my-zsh,所以我在~/.zshrc中定义了MONO_HOME并相应地调整了PATH

export MONO_HOME=/Library/Frameworks/Mono.framework/Home
export PATH=$MONO_HOME/bin:$PATH

一旦安装好了mono,你就可以使用它了:

$ mono --version
Mono JIT compiler version 4.6.2 (mono-4.6.0-branch/08fd525 Thu Nov 10 20:28:28 EST 2016)
Copyright (C) 2002-2014 Novell, Inc, Xamarin Inc and Contributors. www.mono-project.com
    TLS:           normal
    SIGSEGV:       altstack
    Notification:  kqueue
    Architecture:  x86
    Disabled:      none
    Misc:          softdebug
    LLVM:          yes(3.6.0svn-mono-master/8b1520c)
    GC:            sgen

这对我非常完美,我也使用oh-my-zsh。我会补充说明,请确保source ~/.zshrc以使更新的命令生效。 - james-see
这就是解决问题的方法。由于某种原因,我的系统上没有任何东西使用/etc/paths.d,因此添加的mono-commands条目被忽略了。这对我来说解决了所有问题,包括Unity智能感知/自动完成在Visual Studio Code中不起作用。令人惊讶的是,brew版本非常更新。谢谢! - Qix - MONICA WAS MISTREATED

7
我一直在关注这个页面,因为我在El Capitan上第一次安装Mono时也遇到了问题。我发现框架已经安装,但是命令没有放入/usr/local/bin中。尝试使用符号链接似乎没有效果,因为当我尝试使用mono命令时会出现错误,并且它正在错误的位置寻找库文件。
最后我通过试错找到了解决方法,那就是在终端中使用命令将$PATH设置为Mono框架所在的路径:
export PATH=/Library/Frameworks/Mono.framework/Versions/4.2.0/bin/:${PATH}

由于我不是程序员或编码人员(至少在 OS X 上很长一段时间以来都不是),这使我能够使用 mono 运行 Duplicati(这也是我最初想要的),但我不确定这是否是解决问题的正确方式,甚至是否应该这样做。有实际编程经验的人可以发表评论或澄清吗?


5
通过创建到mono命令的符号链接,我们成功使其工作。ln -s /Library/Frameworks/Mono.framework/Versions/Current/bin/mono /usr/local/bin/mono - Nathan Moinvaziri

3

El Capitan现在在"rootless"模式(也称为系统完整性保护)下保护某些系统目录。如果您运行命令ls -lO /System/Library/LaunchDaemons,则会看到该目录下的文件和目录现在被标记为"受限制的"。

您可以按以下步骤禁用rootless模式:

  1. 重新启动进入恢复模式(重新启动并按住Cmd-R)
  2. 打开终端
  3. 使用此命令:csrutil disable

重新启动并运行在El Capitan之前有效的命令

  1. 安装最新版本的Mono。

完成后,强烈建议您按照相同的步骤启用SIP,但在第3步中使用csrutil enable。

我在尝试安装pear/pecl模块和macports/homebrew应用程序时遇到了相同根本原因的问题。这些通常需要将文件安装到/usr/include和/usr/lib中,这两个目录现在也被限制。

注意:互联网上关于此问题的先前答案会给出修改NVRAM设置的说明,但是Apple表示,在El Capitan的公共发布版中,NVRAM方法将停止工作。GM版已经禁用了NVRAM解决方法,因此这个答案应该可以帮助您解决问题。


2
  1. 打开 .bash_profile 文件

  2. 在文件中添加 export PATH=$PATH:/Library/Frameworks/Mono.framework/Versions/Current/Commands

  3. 完成! enter image description here


1
快速摘要: 目前,mono框架安装程序只能在根目录下正确运行。它会自动将/Library/Frameworks/Mono.framework/Versions/Current/Commands添加到$PATH,但我不知道是否需要手动添加/Library/Frameworks/Mono.framework/Versions/Current/bin/或者一切是否都可以正常工作。(Commands是指向bin的符号链接,但仍可能无法正常工作)
更深入的了解: 最近我从MonoFramework-MDK-4.8.0.520.macos10.xamarin.universal.pkg安装了mono。我将其安装在/Volumes/osxapps/而不是根目录,但安装仍然期望所有内容都在根目录中。它将/Library/Frameworks/Mono.framework/Versions/Current/Commands添加到$PATH,但/Library/Frameworks/Mono.framework/中的所有文件夹都是空的。所有的文件都在/Volumes/osxapps/Library/Frameworks/Mono.framework/.中。
此外,许多位于 /Volumes/osxapps/Library/Frameworks/Mono.framework/ 的内容,包括 Commands 都不是文件夹,而是符号链接,因为它们期望文件夹在根目录下而无法正常工作。例如:如果所有内容都安装在根目录中,则 /Library/Frameworks/Mono.framework/Versions/Current/Commands 是指向 /Library/Frameworks/Mono.framework/Versions/Current/bin 的符号链接,而 /Library/Frameworks/Mono.framework/Versions/Current/ 也是一个符号链接。

我添加了:

export PATH="/Volumes/osxapps/Library/Frameworks/Mono.framework/Versions/4.8.0/bin:$PATH"

我将.bash_profile复制到~/中,允许我运行命令/可执行文件,但它们都因为仍然期望在根目录中找到文件而导致错误。

所以我将文件夹从/Volumes/osxapps/Library/Frameworks复制到/Library/Frameworks/,解决了所有错误并使一切正常工作,但现在我有两个Mono.framework的副本,并且我一开始不想将其安装在根目录,因为根路径在SSD上,空间有限。

更好的解决方案是按照this page底部的说明卸载mono,然后在根目录上重新安装。

然而,对我来说,最好的安装方式仍然是在/Volumes/osxapps/上进行安装,但我不知道如何最好地实现这一点。(我可能只需重新创建一堆符号链接)。我本来想告诉mono-project,如果您不安装到根目录,则其安装程序会弄乱一切,但我也不确定最佳方法是什么。因此,我在这里发布了我已经学到的内容,希望它能帮助其他人。


1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接