- 投稿日:2020-08-05T20:45:49+09:00
UnityのC#からGitを叩く
UnityのC#からGitを叩く
UnityのC#のEditor拡張スクリプトからGitコマンドを叩く機会があったので、忘れないうちにまとめます。
サンプルコマンド
今回、例として、UnityのC#から以下のコマンドを叩いてみます。
git config core.autocrlf改行コードを自動で変換する機能が有効になっているか確認できるコマンドです。
サンプルコード
以下がサンプルコードです。外部から
GetAutocrlf
を叩けばコマンドが実行されます。using System; using System.Diagnostics; using System.IO; using UnityEditor; using UnityEngine; using Debug = UnityEngine.Debug; public class GitCommandPractice { /// <summary> /// Gitのautocrlfを確認する。 /// </summary> public void GetAutocrlf() { // gitのパスを取得する。 string gitPath = GetGitPath(); // gitのコマンドを設定する。 string gitCommand = "config core.autocrlf"; // コマンドを実行して標準出力を取得する。 string autocrlf = GetStandardOutputFromProcess(gitPath, gitCommand).Trim(); Debug.Log(autocrlf); } /// <summary> /// Gitの実行ファイルのパスを取得する。 /// </summary> /// <returns>Gitのパス</returns> private string GetGitPath() { // Macのとき if (Application.platform == RuntimePlatform.OSXEditor) { // パスの候補 string[] exePaths = { "/usr/local/bin/git", "/usr/bin/git" }; // 存在するパスで最初に見つかったもの return exePaths.FirstOrDefault(exePath => File.Exists(exePath)); } // Windowsはこれだけで十分 return "git"; } /// <summary> /// コマンドを実行して標準出力を取得する。 /// </summary> /// <param name="exePath">実行ファイルのパス</param> /// <param name="arguments">コマンドライン引数</param> /// <returns>標準出力</returns> private string GetStandardOutputFromProcess(string exePath, string arguments) { // プロセスの起動条件を設定する。 ProcessStartInfo startInfo = new ProcessStartInfo() { FileName = exePath, Arguments = arguments, WindowStyle = ProcessWindowStyle.Hidden, UseShellExecute = false, RedirectStandardOutput = true, }; // プロセスを起動する。 using (Process process = Process.Start(startInfo)) { // 標準出力を取得する。 string output = process.StandardOutput.ReadToEnd(); // プロセスが終了するかタイムアウトするまで待つ。 process.WaitForExit(TimeoutPeriod); return output; } } }解説
C# の
Prosess
を使って、Gitコマンドを叩き、その標準出力を読み取るという仕組みです。
GetGitPath()
では、Gitの実行ファイルのパスを取得しています。Gitの実行ファイルのパスは、環境変数Pathに登録されていることが一般的だと思うので、単に
git
と記述してもほとんどの場合、問題ないと思います。ただし、私のMac環境ではそれではうまく行かなかったので、
/usr/local/bin/git
とusr/bin/git
の2種類を明示的にハードコーディングし、どちらか見つかった方を実行ファイルとして利用するようにしました。さいごに
本記事作成にあたり、以下を参考にしました。ありがとうございました。
- 投稿日:2020-08-05T13:38:58+09:00
ssh接続で`load pubkey "~/.ssh/KEYNAME": invalid format`というエラーが出る
MacOSでgithubへ接続する際、毎回パスワードを聞かれるので
https://qiita.com/rorensu2236/items/df7d4c2cf621eeddd468
を参考にssh接続するようにしたが、接続するたびに
$ git fetch load pubkey "/Users/kanada/.ssh/KEYNAME": invalid formatというWarningが表示されるようになってしまった(認証自体は成功しているし、
git
コマンドも使用できている)。https://bbs.archlinux.org/viewtopic.php?pid=1909206#p1909206
を参考に、
~/.ssh/KEYNAME
に対応する公開鍵を、
~/.ssh/KEYNAME.pub
という名前で保存することでWarningを消すことができた。
- 投稿日:2020-08-05T08:20:58+09:00
VSCodeの「format on save」を統一していなかったばかりにマージの手間が増えたよって話
概要
社内で、とあるプロジェクトのソースをマージしようとした時の話です。
やけに差分が多いなと思っていると、どうやらロジック自体に変更はなく、コードに整形がかかってたり、いなかったりしている様子。
そういえばマージリクエストを出してくれてるのは今週から入ったメンバーだな、と思い問い合わせてみると・・・なにが起きたか
開発者によって
VSCode
の拡張機能や設定が異なり、特にPrettier
等のコードフォーマッター周りの設定が異なると、各自が修正したかった箇所以外にも整形がかかる(もしくはかからない)状態となっていました。
結果的にマージ時に、意図しない差分が発生してなかなかに手間になっていました。実例として、自分が遭遇したのは下記の例です。
format on save
が有効/無効になっている
format on save
はCtrl + S
で保存した際にコードフォーマットをする/しないの設定です。
これが開発チーム内で統一されていれば良かったのですが、今回はされていませんでした。
format on save
の確認方法はVSCode
の【設定】から検索するか、Settings.json
に下記の記載があるかで参照できます。{ "editor.formatOnSave": true }まとめ
すぐに原因が分かったため、チーム内であらためて
format on save
をはじめとするVSCode
の設定について共有しました。
余談ですが、複数プロジェクトにまたがってアサインしている場合は、プロジェクト毎に開発規約が異なり、整形ルールも変わってくると思うのでformat on save
等はワークスペースの設定に持っていくことをお勧めします。
そのあたりは下記記事が詳しいです。備考
個人ブログの方にも同様の記事を掲載してあります。