private static void SpecifyLangVersion(CSharpProject csproj)
        {
            var unityVersion  = Application.unityVersion;
            var csharpVersion = unityVersion.CompareTo("5.5") >= 0 ? default(int?) : 4;

            csproj.SpecifyLangVersion(csharpVersion);
        }
        private void UpdateReferences(CSharpProject csproj)
        {
            var log = new System.Text.StringBuilder();

            // Boo.Lang は無条件で消す。
            csproj.RemoveReference("Boo.Lang");

            csproj.RemoveReference(RootProject.Name);

            foreach (var refProj in RootProject.GetAllCSharpProjectReferences())
            {
                log.AppendLine($"updare ref {refProj.Name}");
                // Game プロジェクト関連のアセンブリ参照削除。
                csproj.RemoveReference(refProj.Name);
                // Game プロジェクト関連の参照を追加。
                csproj.AddProjectReference(refProj);
            }

            foreach (var analyser in RootProject.AnalyzerReferences)
            {
                log.AppendLine($"add analyzer {analyser}");
                // Game プロジェクト関連のアナライザーを追加。
                csproj.AddAnalyzer(analyser);
            }

            Debug.Log(@"ProjectPostprocessor: UpdateReferences
" + log.ToString());
        }
        private string OnGeneratedProjectFile(string fileName, string fileContent)
        {
            // Editor, Plugins プロジェクトは無視する。
            if (fileName.Contains(".Editor."))
            {
                return(fileContent);
            }

            var csproj = new CSharpProject(Path.Combine(ProjectRoot, fileName), fileContent);

            UpdateReferences(csproj);
            SpecifyLangVersion(csproj);

            return(csproj.Content);
        }
        private string OnGeneratedProjectFile(string fileName, string fileContent)
        {
            var csproj = new CSharpProject(Path.Combine(ProjectRoot, fileName), fileContent);

            if (!fileName.Contains(".Editor."))
            {
                // Editor プロジェクトの場合、DLL参照→プロジェクト参照のつなぎ変えまではやらない
                // (<LangVersion>4</LangVersion> の書き換えとかだけする。)
                UpdateReferences(csproj);
            }

            csproj.RemoveTargetFrameworkProfile();
            SpecifyLangVersion(csproj);

            return(csproj.Content);
        }
Beispiel #5
0
        private static IEnumerable <CSharpProject> GetRecursively(CSharpProject project, Func <CSharpProject, IEnumerable <CSharpProject> > getChildren, HashSet <CSharpProject> set)
        {
            yield return(project);

            foreach (var x in getChildren(project))
            {
                if (set.Contains(x))
                {
                    continue;
                }

                set.Add(x);
                foreach (var child in GetRecursively(x, getChildren, set))
                {
                    yield return(child);
                }
            }
        }
Beispiel #6
0
        /// <summary>
        /// プロジェクトに別プロジェクトの参照を追加する。
        /// </summary>
        /// <param name="project">プロジェクト。</param>
        public void AddProjectReference(CSharpProject project)
        {
            var xml = $@"    <ProjectReference Include=""{project.Path}"">
      <Project>{{{project.Guid.ToString().ToUpper()}}}</Project>
      <Name>{project.Name}</Name>
    </ProjectReference>
";

            var match = regProjectReferenceClose.Match(Content);

            if (match.Success)
            {
                var index = match.Index + match.Value.Length - "</ItemGroup>".Length;
                Content = Content.Insert(index, xml);
            }
            else
            {
                var index = Content.LastIndexOf("</Project>"); // ProjectReference 用の ItemGroup が見つからないので末尾に追加する。
                xml     = $"  <ItemGroup>\n{xml}  </ItemGroup>\n";
                Content = Content.Insert(index, xml);
            }
        }
 /// <summary>Record Constructor</summary>
 /// <param name="gameProject"><see cref="RootProject"/></param>
 public ProjectPostprocessor(CSharpProject gameProject = default(CSharpProject))
 {
     RootProject = gameProject;
 }