やりたいこと
Unityが生成するslnファイルは、手動で外部のcsprojを足しても勝手に巻き戻されてしまいます。
そこで、スクリプトからslnファイルにcsprojを追加するようにします。
既存のやり方としてVSTUのイベントにHookさせる方法がありますが、この方法はIDEにRiderを使っている場合は利用できませんでした。
やり方
AssetPostprocessorのOnGeneratedSlnSolution
を使います。
(ドキュメントには書いてないですが、2018.2からこのイベント関数が追加されています。)
そこで、次のようなエディタ拡張を配置すれば自動的にslnファイルにcsprojが追加されるようになります。
using UnityEditor;
public class SolutionFileFixer : AssetPostprocessor
{
private static string OnGeneratedSlnSolution(string path, string content)
{
var solutionGuid = "solutionのGUID";
var projectGuid = "projectのGUID";
var projectName = "プロジェクト名";
var projectPath = "csprojへのパス";
var add =
$"Project(\"{solutionGuid}\") = \"{projectName}\", \"{projectPath}\", \"{projectGuid}\",\"{Environment.NewLine}EndProject";
// 最後に追加
var newContent = content.Replace($"EndProject{Environment.NewLine}Global",
$"EndProject{Environment.NewLine}{add}{Environment.NewLine}Global");
return newContent;
}
}
おまけ
を参考に、Boo.Langも消し去るようにしてみます。
使うものはOnGeneratedCSProject
イベントです。
using UnityEditor;
public class SolutionFileFixer : AssetPostprocessor
{
private static string OnGeneratedSlnSolution(string path, string content)
{
var solutionGuid = "solutionのGUID";
var projectGuid = "projectのGUID";
var projectName = "プロジェクト名";
var projectPath = "csprojへのパス";
var add =
$"Project(\"{solutionGuid}\") = \"{projectName}\", \"{projectPath}\", \"{projectGuid}\",\"{Environment.NewLine}EndProject";
// 最後に追加
var newContent = content.Replace($"EndProject{Environment.NewLine}Global",
$"EndProject{Environment.NewLine}{add}{Environment.NewLine}Global");
return newContent;
}
private static string OnGeneratedCSProject(string path, string content)
{
var document = XDocument.Parse(content);
document.Root.Descendants()
.Where(x => x.Name.LocalName == "Reference")
.Where(x => (string) x.Attribute("Include") == "Boo.Lang")
.Remove();
return document.Declaration + Environment.NewLine + document.Root;
}
}