How to Use Port in Mac OS X to Install New Utilities

假设我们想要在Mac OS X中安装:
MySQL,这是一个开源的免费的数据库,当然备Oracle收购之后有一些变化。
postgreSQL,这又是另外一个开源的免费的数据库。
perl,这是一种流行的编程语言。
lua,这又是另外一种流行的编程语言。
watch,这是一个实用程序,可以默认每隔2秒重复执行某条命令,比如你想监控一个目录下的文件生成情况,这条命令就很有用。
tree,这是一个实用程序,可以提供类似于ls -R的功能,但是输出是更加直观的树状结构。

当然,我们可以在网络中一个一个地找这些程序,然后一个一个地安装,用不同的安装方法,但是,你也可以选择非常简单的方法,这就是本文要介绍的MacPorts。

在Linux中如果我们要安装一些软件,要解决各个软件之间的包依赖性关系,我们会使用到apt-get(Ubuntu)或者yum(Redhat,CentOS)或者zypper(openSUSE),如果你熟悉一些Linux的话,对于这些软件包管理程序应该有所耳闻。而MacPorts正是在Mac OS X上的软件包管理程序。

安装MacPorts最简单的方法是直接下载dmg文件,双击安装 - Lion版安装文件 | Snow Leopard版安装文件

MacPorts安装完以后,我们就可以通过命令行的方式来安装其它软件了,可以参看具体命令文档。以下列出常用的命令:

1. 更新本地软件库列表,该命令可以不定时多次执行(sudo以后需要输入密码,输入你自己用户的密码即可)。

sudo port selfupdate

2. 列出软件库中有哪些软件,注意,该命令会输出大量软件名称,因此建议添加more来查看,或者使用后面的search命令。

port list | more

3. 检索需要安装的软件。

port search 

当然,还有更精确地搜索,比如如果直接port search tree会出现上百个结果,但是如果执行以下命令,就只会出现一个结果。

$ port search --name --exact tree
tree @1.6.0 (sysutils)
    display tree-view of directories with optional color/HTML output

4. 列出已经通过port安装的软件。

port installed

5. 安装软件,一些具有依赖性的软件会连带自动安装,比如安装LUA,会安装ncurses和readline。

sudo port install 

6. 卸载软件。

sudo port uninstall 

7. 清理未成功安装的软件,比如一些软件由于编译问题或者其它原因没有安装成功。

sudo port clean --all 

8. 查看安装的软件都安装了哪些内容。

port contents 

比如查看tree都安装了哪些内容。

$ port contents tree
Port tree contains:
  /opt/local/bin/tree
  /opt/local/share/doc/tree/CHANGES
  /opt/local/share/doc/tree/LICENSE
  /opt/local/share/doc/tree/README
  /opt/local/share/man/man1/tree.1.gz

9. 升级当前安装过的软件。

sudo port upgrade 

升级全部有新版本的软件。升级以后将会保留以前的旧版本,只是将旧版本设置为Inactive。

sudo port upgrade outdated

当确认新版本软件工作正常以后,可以通过以下命令删除所有旧版本软件。

sudo port uninstall inactive

或者通过以下命令,删除指定的旧版本软件。

sudo port uninstall makedepend @1.0.2_0

如果想在升级的时候就直接删除旧版本软件,可以在upgrade时使用-u参数。

sudo port -u upgrade 

10. Troubleshooting
由于MacPorts与Xcode联系紧密,因此如果在升级完操作系统(比如从10.8升级到10.9),可能之前运行正常的MacPorts就无法使用了,比如出现以下报错。

localhost:~ Kamus$ sudo port selfupdate

WARNING: Improper use of the sudo command could lead to data loss
or the deletion of important system files. Please double-check your
typing when using sudo. Type "man sudo" for more information.

To proceed, enter your password, or type Ctrl-C to abort.

Password:
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.1.2 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is outdated, installing new version 2.2.1
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl

Error: /opt/local/bin/port: port selfupdate failed: Error installing new MacPorts base: command execution failed
localhost:~ Kamus$ sudo port selfupdate
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.1.2 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is outdated, installing new version 2.2.1
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl

Error: /opt/local/bin/port: port selfupdate failed: Error installing new MacPorts base: command execution failed

解决方法是将Xcode的Command Line Tools再安装一遍,通过以下方法。

$ sudo xcode-select --install

然后再运行port命令就功能正常了。

localhost:~ Kamus$ sudo port selfupdate
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.1.2 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is outdated, installing new version 2.2.1
Installing new MacPorts release in /opt/local as root:admin; permissions 0755; Tcl-Package in /Library/Tcl


The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated

VMware and scsi_id

VMware Fusion中测试Cent OS 6中的udev功能时,发现scsi_id命令无法返回设备的SCSI ID。

# fdisk -l /dev/sdb

Disk /dev/sdb: 1073 MB, 1073741824 bytes
255 heads, 63 sectors/track, 130 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

Disk /dev/sdb doesn't contain a valid partition table
# /sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb

这个问题在Oracle VirtualBox中并不会出现,当然并不是说VirtualBox就比VMware好,作为Mac中的原生app,VMware Fusion确实要比VirtualBox美观,但是在功能上而言,VirtualBox毫不逊色,而且VirtualBox是免费的,所以如果要在自己的台式机或者笔记本中测试虚拟机,仍然强烈推荐使用VirtualBox。

言归正传,如何修改VMware Fusion,让其可以提供正确的设备SCSI ID呢?参考文章是:
The Case of VMware and the missing SCSI ID

方法如下:
1. 在虚拟机关闭以后,进入虚拟机的目录

2. 用文本编辑器修改vmx文件

$ ls *vmx
[ VMplanet ] CentOS 6.0.vmx
$ vi "[ VMplanet ] CentOS 6.0.vmx"

3. 在vmx文件中任意位置(通常在最后)添加如下行:

disk.EnableUUID = "TRUE"

4. 重新启动虚拟机,此时可以正确获取SCSI ID

#/sbin/scsi_id --whitelisted --replace-whitespace --device=/dev/sdb
36000c29577b5db74013db535e0155e01

注意:在手工修改完vmx文件以后,如果再进行任何虚拟机的设置,比如添加磁盘,修改网卡类型或者其它的操作,disk.EnableUUID参数又会重置为FALSE,所以每次进行虚拟机设置以后,都需要手工再次修改该参数。当然重启虚拟机,或者虚拟机内Guest操作系统中的任何操作,都不会重置该参数。

How to using Quick Look to view SQL scripts in Mac OS X

在开始本文之前,先介绍两个与本文毫无关系但是很酷的QuickLook插件。
Zip Quick Look Plugin - 直接在QuickLook中查看zip包中的内容。
Folder Quick Look Plugin - 直接在QuickLook中查看文件夹的内容。

Mac OS X的Quick Look是很强大的功能。在Finder中高亮需要查看的文件,然后按空格键就可以在弹出的新窗口中直接预览该文件的内容,支持几乎所有需要预览的文件类型,比如txt文本,pdf,微软office文档,苹果iWork文档,可以用Quicktime播放的视频等等。

但是正如Apple的很多产品一样,预置的功能已经很好,但是却几乎不给使用者任何调整的方法,比如在我的机器里有很多.sql扩展名的SQL脚本文件,我很想能够用Quick Look来快速查看,但是在Mac OS X中天生的Quick Look是不支持快速预览sql文件的,并且没有给于任何选项来将某些文件类型加入到Quick Look中。

在默认情况下,用Quick Look打开SQL脚本,将仅仅显示如下文件信息窗口。我个人的系统设置是如果双击SQL脚本,则用TextWrangler打开,因此这里显示为“TextWrangler text document”。

我们需要手工修改一些文件,来让Quick Look也可以直接预览SQL脚本。

1. 修改Info.plist文件,在我的例子中是修改TextWrangler的plist文件,如果你选择不同的应用程序打开SQL脚本,那么需要修改相应程序的plist。

vi /Applications/TextWrangler.app/Contents/Info.plist

在最后这两行的前面:

</dict>
</plist>

添加下面这些内容:

<key>UTExportedTypeDeclarations</key>
<array>
<dict>
  <key>UTTypeConformsTo</key>
  <array>
	<string>public.text</string>
	<string>public.plain-text</string>
  </array>
  <key>UTTypeDescription</key>
  <string>SQL Script file</string>
  <key>UTTypeIdentifier</key>
  <string>com.barebones.textwrangler</string>
  <key>UTTypeTagSpecification</key>
  <dict>
	<key>com.apple.ostype</key>
	<string>TEXT</string>
	<key>public.filename-extension</key>
	<array>
	  <string>sql</string>
	</array>
  </dict>
</dict>
</array>

其中com.barebones.textwrangler可能需要改成你使用的应用名称,比如TextMate则是com.macromates.textmate,通常这个名字可以在plist文件的前面部分找到。

2. 使改动生效

touch /Applications/TextWrangler.app

然后再次使用Quick Look就可以直接查看SQL脚本内容了。

参考文档:
Add Quick Look support for certain file formats