rcmdnk's blog
Last update

Apple MacBook Air Early 2014(11インチAir,4GB RAM,128GB SSD,1.4GHz)(整備済み品)

Homebrew-cask のお陰で Homebrew でアプリも管理出来ますが、 App Storeからダウンロードするような物は管理できません。

そこさえ出来ればMacにインストールが必要な物のほぼ全てが管理出来るのですが、 その辺、やはり結構難しいみたいで少なくともインストールをコマンドラインから 行う様な方法は今のところ分かりません。

ですが、すでにインストールされてるアプリの中でApp Storeからインストールされた 物を探したり、 それらをアンインストールする方法はあるみたいなので、 その辺を homebrew-file に組み込んでみました。

App Storeからインストールされたアプリをコマンドラインで探す

App Storeからインストールされたアプリは その中にContents/_MASReceipt/receipt というファイルを持っています。

List All Apps Downloaded from the Mac App Store via Command Line

このファイルを探すことによってインストールされたアプリを App Storeからインストールされたものかどうか判断することが出来ます。

上の参考サイトでは

$ find /Applications -path '*Contents/_MASReceipt/receipt' -maxdepth 4 -print |\sed 's#.app/Contents/_MASReceipt/receipt#.app#g; s#/Applications/##'

こんな感じでfindを使った方法が紹介されてます。

homebrew-file の中ではpythonなので

1
2
3
4
# App Store
import glob
apps = glob.glob('/Applications/*/Contents/_MASReceipt/receipt')
appstore_list = [x.split("/")[2].split(".app")[0] for x in apps]

こんな感じで取ってきています。

homebrew-fileをアップデートしてもらってbrew file initしてもらうと Brewfileの最後に

Brewfile
1
2
3
4
5
6
7
8
...
# App Store applications
appstore App Language Chooser
appstore GarageBand
appstore iMovie
appstore iPhoto
appstore Keynote
...

こんな感じでApp Storeからインストールされたアプリ一覧が載るようになります。

App Storeからインストールされたアプリをコマンドラインでアンインストールする

App Store以外から取ってきたアプリは基本的には そのアプリ自体を消してしまうだけです。 (ただし、設定ファイル等全てキレイにしたい場合はApp Cleanr等使う方が良いです。)

一方、App Storeからインストールするものは、 その方法で消してしまうと後からApp Storeから再インストール出来なくなったり してしまうので、きちんと消すためには Launchpadを立ち上げてそこから削除します。

Launchpadの画面でどれでもいいからアイコンをクリック長押し、 そうすると全部のアイコンがゆらゆらし始めてApp Storeから インストールされたものに関しては右上にx印が出るのでそれをクリックすれば Macからアンインストールされます。

ただ、何やらLaunchpadにものすごいバグがあって Launchpadからの削除にはちょっと注意が必要みたいですが。 (未だこれに関してのアップデートは無いように見えます。)

Launchpadからアプリを削除するだけでApplication Support以下のファイルを全消ししてしまうバグが見つかる - Macの手書き説明書

ともかく、アンインストールするときに 単にrmとかで消してしまうと問題が起こるので きちんと扱おうとするとLaunchpad経由等、正しく情報を書き換える事が必要です。

実はこの様なApp Storeからインストールされたアプリに関して、 OS Xではuninstallという隠し?コマンドがあってこれを使ってアンインストールすることが出来ます。

Uninstalling App Store apps from the command line

アプリの位置をfile:///で指定して管理者権限で

$ sudo uninstall "file:///Applications/App Language Chooser.app"

の様に実行してあげればOK。

追記: 2014/11/16

空白のあるアプリの場合には"で囲っても 1

$ sudo uninstall "fle:///Applications/App Language Chooser.app"
2014-11-XX XX:XX:XX.XXX uninstall[46524:15841339] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[__NSSetM addObject:]: object cannot be nil'
*** First throw call stack:
(
        0   CoreFoundation                      0x00007fff8a3a764c __exceptionPreprocess + 172
        1   libobjc.A.dylib                     0x00007fff8cbb16de objc_exception_throw + 43
        2   CoreFoundation                      0x00007fff8a2b4cb9 -[__NSSetM addObject:] + 329
        3   uninstall                           0x00000001078355ab uninstall + 5547
        4   libdyld.dylib                       0x00007fff8fea95c9 start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
$

みたいにエラーが出ます。 これを回避するには下のページで指摘されてる様に、 空白を%20にしたり、URIエンコードしてあげる必要があります。

Mac App Storeからインストールしたアプリをアンインストールするターミナルコマンド - Macの手書き説明書

App\ Language\ Chooser.appの様に空白をセスケープしてもダメなので きちんとApp%20Language%20Chooser.appの様にエンコードしてあげる必要があります。

Brew-fileの中では

1
2
3
import urllib2
cmd = "sudo uninstall file:///Applications/" + urllib2.quote(p) + ".app"
...

みたいな感じでurllib2quote関数を使ってエンコードすることにしました。 これで App Language Chooser.appの様な空白入りのアプリも大丈夫です。

追記ここまで

ここで管理者権限としてパスワードを聞かれますが、 アンインストール時にさらにポップアップが出て管理者のパスワードを要求されます。

なので、コマンドラインから実行できるものですが、 実際にMacそのものにログインしてGUIでポップアップを処理できる様になってないと 使えないみたいです。 (外からsshした様な場合には使えない。)

なのでちょっと面倒がありますが、一応コマンドラインから アンインストールを始める事が可能です。

また、このコマンドをApp Store以外からインストールしたものに行うと アンインストール出来ない、と出ます。

homebrew-fileでは、cleanするときにBrewfileにないアプリが インストールされてた場合はそれをuninstallするようにしました。

追記: 2016/02/12

どうもOS X El Capitan (10.11)からはuninstallコマンドが無くなったようです。

その代わり、普通にアプリをそのまま削除しても App Storeから再インストールが問題なく出来る様になっています。

追記ここまで

まとめ

Homebrew-fileで出来る様になったことは

  • init等でリスト作成時にApp StoreのアプリもBrewfileに書き出す。
  • clean時にBrewfileにないものは削除する。(ただし、最初にsudoのパスワードを コマンドラインから聞かれ、さらにポップアップでアプリ毎に聞かれます。)
  • install時には今のところコマンドラインベースのインストール方法がわからないので 取り敢えずインストールされてないものがあったら Please install App Language Chooser from App Store!みたいな メッセージを出す。

と言った感じ。

brew file initすると したみたいな感じで appstoreというコマンドともに記述される様になります。

Brewfile
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# tap repositories and their packages

## caskroom/cask
tap caskroom/cask
install brew-cask
cask install adobe-reader

## rcmdnk/file
tap rcmdnk/file
install brew-file

# Other Homebrew packages
install git
install vim --HEAD --with-lua

# App Store applications
appstore GarageBand
appstore iMovie

インストールではappstoreのアプリについては 手作業で入れて!という表示が出るだけですが、 それでもインストールされてるものを簡単に管理できて、 他の環境で合わせたりするには便利だと思います。

追記: 2016/02/13

masというコマンドラインツールが開発され、これによって コマンドラインからApp Storeのアプリをインストールすることが可能になりました。

のでそれを使ってBrew-fileでも App Storeのアプリを自動で入れられるようにしました。

追記ここまで

出来そうなこと

インストール自体はApple IDを使ってApp Storeからインストール、と言う作業を 他から行うことが殆ど無理そうな感じです。

唯一できることとしたら、1つ自分の大元サーバーMacを作っておいて そこではApp Storeを使ってダウンロードし、 他のMacでは、scpでもなんでも手段は良いのでそのサーバーからコピーしてくる、 と言う方法。 一応License的な面でも両方自分で使ってるものなら問題ないみたいです。

アップデートだけに関してAutometerを使ってごにょごにょする、 と言うものもありました。 その辺使えばインストールも出来そうなできなそうな感じですが、 いずれにしろAutometerの方で設定を行わないとダメなので 一筋縄では行かない感じ。

mac appstore - Can I install or update Mac App Store apps through a command line using terminal? - Ask Different

osx - Can Mac App Store installs & upgrades be automated? - Ask Different

osx - How to apply Mac App Store software updates from the command line? - Super User

それから、OS Xには softwareupdateというコマンドがあります。

$ softwareupdate -l
Software Update Tool
Copyright 2002-2012 Apple Inc.

Finding available software
Software Update found the following new or updated software:
   * RAWCameraUpdate6.01-6.01
        デジタルカメラ RAW 互換性アップデート (6.01), 7083K [recommended]
$

な感じでアップデート情報が見れたりsoftwareupdate -i -a でアップデートのインストールをコマンドラインから行う事ができます。

ただ、これはOS自体や、iTunes等、システムに組み込まれたアプリ (従ってApp Storeにも出てこないもの) に関してのアップデートだけを行えるものなのでApp Storeからインストールしたアプリなんかは したものにアップデートできません。

なので、結局これは自動アップデートで行える事が出来るだけのコマンドなので 余り使う機会はないかな、と言った感じ。

ということで、インストールに関してはやはり難しそうだな、というのが 今のところです。

Sponsored Links
  1. 実際に、空白のないもの(LINE.app, 名前が短かったから。。。)で試したんですが 空白入りのものは試してませんでした、すいません。 App Language Chooserはリストの一番上にあったので今度はそのまま書いた感じです。。。

    ちなみに空白入りを"で囲わないと

    $ sudo uninstall fle:///Applications/App Language Chooser.app
    URL is not uninstallable: Language
    URL is not uninstallable: Chooser.app
    URL is not uninstallable: fle:///Applications/App
    

    と別の物としてそれぞれ認識されます。

    逆に言うと、複数のアプリを同時にアンインストールすることも可能です。

Sponsored Links

« GitHub PageのProject siteを使って英語用ブログを作った Homebrew-fileのwrapperをスクリプトから関数に変更 »

}