xcrunコマンド実行したら「xcrun: error: invalid active developer path」でエラーになる

検索して解決できたけど若干事象が違ったのとログを残すためにメモすることにしました。

# 私のMac環境
私のMacはこちら。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/def209ec-a116-99ae-ff3c-511a153d3cf8.png)

```:terminal
$ sw_vers
ProductName:	Mac OS X
ProductVersion:	10.15.1
BuildVersion:	19B88
```

# 事象
納品されたiOSアプリをデプロイしようと思い `xcrun altool` コマンドを実行したら以下のエラーが出力されて困った。

```
xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools), missing xcrun at: /Library/Developer/CommandLineTools/usr/bin/xcrun
```

# 対処方法
以下を実行するとメッセージと一緒にポップアップが起動してインストールできそう。

```:terminal
$ xcode-select --install
xcode-select: note: install requested for command line developer tools
```
この画面で[インストール]をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/c62af48c-608e-ba33-b18a-6647fe55c269.png)

以下で同意して
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/f8896038-089e-ea6c-4060-99d060937e8e.png)

数分でインストール完了。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/178016/ae1c69ab-58aa-fe13-6ccb-19351f3e8d62.png)

よし。使えるかな？とxcrunコマンド実行したらパスが通ってないって怒られた

```:terminal
$ xcrun altool
xcrun: error: unable to find utility "altool", not a developer tool or in PATH
```

通すパスどこかなとlsで/Applications/配下にXcode.appがいるかどうか確認してみる。いた。

```:terminal
$ ls /Applications/
Cyberduck.app		Numbers.app		Visual Studio Code.app
GarageBand.app		Pages.app		XAMPP
Google Chrome.app	Safari.app		Xcode.app
Keynote.app		Slack.app		direct.app
LINE.app		Utilities		iMovie.app
LoGoチャット.app	VirtualBox.app
$ 
```

パスを通す。

```:terminal
$ sudo xcode-select --switch /Applications/Xcode.app/
Password:
```

再度xcrunコマンド使えるか確認

```:terminal
$ xcrun altool
Copyright (c) 2009-2019, Apple Inc. Version 4.00.1181

Usage: altool --validate-app -f <file> -t <platform> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}
       altool --upload-app -f <file> -t <platform> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}
       altool --notarize-app -f <file> --primary-bundle-id <bundle_id> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>} [--asc-provider <provider_shortname>]
       altool --notarization-info <uuid> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}
       altool --notarization-history <page> -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>} [--asc-provider <provider_shortname>]
       altool --list-apps -u <username> {[-p <password>] | --apiKey <api_key> --apiIssuer <issuer_id>}
       altool --store-password-in-keychain-item <name_for_keychain_item> -u <username> -p <password>

Authentication: Most commands require authorization.
                There are two methods available: user name with password, and apiKey with apiIssuer.

                -u, --username <username> Username. Required to connect for validation, upload, and notarization.
                -p, --password <password> Password. Required if username specified and apiKey/apiIssuer are not.
                                          If this argument is not supplied on the command line, it will be read from stdin.
                                          Alternatively to entering <password> in plaintext, it may also be specified using a '@keychain:'
                                          or '@env:' prefix followed by a keychain password item name or environment variable name.
                                          Example: '-p @keychain:<name>' uses the password stored in the keychain password item named <name>.
                                                                         You can create and update keychain items with the
                                                                         --store-password-in-keychain-item command.
                                          Example: '-p @env:<variable>'  uses the value in the environment variable named <variable>

                --apiKey <api_key>        apiKey. Required for JWT authentication while using validation, upload, and notarization.
                                          This option will search the following directories in sequence for a private key file
                                          with the name of 'AuthKey_<api_key>.p8':  './private_keys', '~/private_keys', '~/.private_keys',
                                          and '~/.appstoreconnect/private_keys'.
                --apiIssuer <issuer_id>   Issuer ID. Required if --apiKey is specified.

 -f, --file <file>                   <file> specifies the path to the file to process.
 -t, --type {osx | ios | appletvos}  Specify the platform of the file.

     --primary-bundle-id <bundle_id> Used with --notarize-app to uniquely identify a package.

     --asc-provider <provider_shortname> Required with --notarize-app and --notarization-history when a user account is associated with multiple
                                         providers.

 -v, --validate-app                  Validates an app archive for the App Store. Authentication and -f are required.
     --upload-app                    Uploads the given app archive to the App Store. Authentication and -f are required.
     --list-apps                     Display all apps associated with your account(s).

     --notarize-app                  Uploads the given app package, dmg or zip file for notarization. Authentication, -f,
                                     and --primary-bundle-id are required. --asc-provider is required for an account associated with multiple providers.
                                     If successful, the UUID associated with the upload is returned.

     --notarization-info <uuid>      Returns the status and log file URL of a package previously uploaded for notarization with the specified <uuid>.
                                     Authentication is required. The log file can be retrieved with 'curl <log_file_url>'.

     --notarization-history <page>   Returns a list of all uploads submitted for notarization. <page> specifies a range of entries where 0
                                     returns the most recent number of entries. A new page value will be returned which can be used as the
                                     <page> value to the next use of --notarization-history and so forth until no more items are returned.
                                     Authentication is required. --asc-provider is required for an account associated with multiple providers.

     --store-password-in-keychain-item <name_for_keychain_item> -u <username> -p <password>
                                     Stores the password <password> in the keychain item named <name_for_keychain_item> associated with the account <username>.
                                     If an item with that name and account already exists in the keychain, its password will be updated. Otherwise a new item
                                     is created with that name. You can use this keychain item with the -p option to mask your password with other commands.
                                     Example: altool --store-password-in-keychain-item MY_SECRET -u jappleseed@apple.com -p "MyP@ssw0rd!@78"
                                              altool --notarize-app -u jappleseed@apple.com -p @keychain:MY_SECRET [...]

     --output-format {xml | normal}  Specifies how the output is formatted. 'xml' displays the output in a structured format; 'normal' displays in
                                     an unstructured format (default).

     --verbose                       Enable logging output.

 -h, --help                          Display this output.
$ 
```

大丈夫っぽい。

# 参考になったリンク
xcrunが見つからない場合の対処
https://qiita.com/toriumi01/items/b91a35fe8bfa7f170964
macOSアップデート後の『xcrun: error: invalid active developer path (/Library/Developer/CommandLineTools)...』の対処法
https://qiita.com/nishina555/items/e23d73067a5cac182a63