/// <summary> /// Parses an asmdef file creating a new instance of <see cref="AssemblyDefinitionInfo"/>. /// </summary> /// <param name="file">The file representing asmdef.</param> /// <param name="unityProjectInfo">Instance of <see cref="UnityProjectInfo"/>,</param> /// <param name="assembly">The Unity assembly reference.</param> /// <param name="isBuiltInPackage">True whether this asmdef lives in the editor installation folder.</param> /// <returns></returns> public static AssemblyDefinitionInfo Parse(FileInfo file, UnityProjectInfo unityProjectInfo, Assembly assembly, bool isBuiltInPackage = false) { if (file.Extension != ".asmdef") { throw new ArgumentException($"Given file '{file.FullName}' is not an assembly definition file."); } else if (!file.Exists) { throw new ArgumentException($"Given file '{file.FullName}' does not exist."); } AssemblyDefinitionInfo toReturn = JsonUtility.FromJson <AssemblyDefinitionInfo>(File.ReadAllText(file.FullName)); if (!Utilities.TryGetGuidForAsset(file, out Guid guid)) { Debug.LogError($"Failed to parse AsmDef meta for asm def: '{file.FullName}', didn't find guid."); } toReturn.assembly = assembly; toReturn.Directory = file.Directory; toReturn.file = file; toReturn.Guid = guid; toReturn.BuiltInPackage = isBuiltInPackage; toReturn.Validate(unityProjectInfo.AvailablePlatforms); toReturn.PrecompiledAssemblyReferences = new HashSet <string>(toReturn.precompiledReferences?.Select(t => t.Replace(".dll", string.Empty)) ?? Array.Empty <string>()); return(toReturn); }
public UnityProjectInfo(IEnumerable <CompilationPlatformInfo> availablePlatforms, string projectOutputPath) { this.availablePlatforms = availablePlatforms; Dictionary <string, Assembly> unityAssemblies = CompilationPipeline.GetAssemblies().ToDictionary(t => t.name); Dictionary <string, CSProjectInfo> csProjects = new Dictionary <string, CSProjectInfo>(); CSProjects = new ReadOnlyDictionary <string, CSProjectInfo>(csProjects); foreach (KeyValuePair <string, Assembly> pair in unityAssemblies) { CSProjectInfo toAdd; string asmDefPath = CompilationPipeline.GetAssemblyDefinitionFilePathFromAssemblyName(pair.Key); if (string.IsNullOrEmpty(asmDefPath)) { if (!pair.Key.StartsWith("Assembly-CSharp")) { Debug.LogError($"Failed to retrieve AsmDef for script assembly: {pair.Key}"); } toAdd = new CSProjectInfo(availablePlatforms, Guid.NewGuid(), null, pair.Value, projectOutputPath); } else { string guid = AssetDatabase.AssetPathToGUID(asmDefPath); if (!Guid.TryParse(guid, out Guid guidResult)) { Debug.LogError($"Failed to get GUID of the AsmDef at '{asmDefPath}' for assembly: {pair.Key}"); } else { guidResult = Guid.NewGuid(); } AssemblyDefinitionAsset assemblyDefinitionAsset = AssetDatabase.LoadAssetAtPath <AssemblyDefinitionAsset>(asmDefPath); AssemblyDefinitionInfo assemblyDefinitionInfo = assemblyDefinitionAsset == null ? null : JsonUtility.FromJson <AssemblyDefinitionInfo>(assemblyDefinitionAsset.text); assemblyDefinitionInfo?.Validate(availablePlatforms); toAdd = new CSProjectInfo(availablePlatforms, guidResult, assemblyDefinitionInfo, pair.Value, projectOutputPath); } csProjects.Add(pair.Key, toAdd); } Plugins = new ReadOnlyCollection <PluginAssemblyInfo>(ScanForPluginDLLs()); foreach (PluginAssemblyInfo plugin in Plugins) { if (plugin.Type == PluginType.Native) { Debug.LogWarning($"Native plugin {plugin.ReferencePath.AbsolutePath} not yet supported for MSBuild project."); } } foreach (CSProjectInfo project in CSProjects.Values) { // Get the assembly references first from AssemblyDefinitionInfo if available (it's actually more correct), otherwise fallback to Assemby IEnumerable <string> references = project.AssemblyDefinitionInfo == null ? project.Assembly.assemblyReferences.Select(t => t.name) : (project.AssemblyDefinitionInfo.references ?? Array.Empty <string>()); foreach (string reference in references) { if (CSProjects.TryGetValue(reference, out CSProjectInfo dependency)) { project.AddDependency(dependency); } else { Debug.LogError($"Failed to get dependency '{reference}' for project '{project.Name}'."); } } foreach (PluginAssemblyInfo plugin in Plugins) { if (plugin.AutoReferenced && plugin.Type != PluginType.Native) { project.AddDependency(plugin); } } } }