16using System.Collections.Generic;
17using System.Diagnostics;
21 [CreateAssetMenu(fileName =
"Package", menuName =
"Package Definition", order = 202)]
23 private const string DEFAULT_PACKAGE_NAME =
"Package.asset";
25 [Tooltip(
"All files within each folder will be included in this package when built.")]
32 [Tooltip(
"All files specified in this list will be included in this package when built.")]
39 [Tooltip(
"All files specified in each package will be included in this package when built.")]
49 return AssetDatabase.FindAssets(
"t:PackageDefinition").
50 Select(guid => AssetDatabase.GUIDToAssetPath(guid)).
52 OrderBy(def => def.DefinitionName).
56 public static void BuildPackage(
string packageGUID) {
57 string assetPath = AssetDatabase.GUIDToAssetPath(packageGUID);
60 if (packageDef !=
null) {
61 packageDef.BuildPackage(interactive:
true);
70 public void BuildPackage(
bool interactive) {
72 if (!TryGetPackageExportFolder(out exportFolder, promptIfNotDefined:
true)) {
77 string exportPath = Path.Combine(exportFolder,
DefinitionName +
".unitypackage");
79 HashSet<string> assets =
new HashSet<string>();
81 HashSet<PackageDefinition> totalPackages =
new HashSet<PackageDefinition>();
82 totalPackages.Add(
this);
83 buildPackageSet(totalPackages);
85 foreach (var package
in totalPackages) {
88 var missingFiles = package._dependantFiles.Distinct().Where(path => !
File.Exists(path));
89 if (missingFiles.Any()) {
90 string message =
"Could not build package [" + package.DefinitionName +
"] because the following dependant files were not found:\n";
91 foreach (var missingFile
in missingFiles) {
92 message +=
"\n" + missingFile;
95 EditorUtility.DisplayDialog(
"Build Failed: Missing file", message,
"Ok");
99 assets.UnionWith(package._dependantFiles);
103 foreach (var folder
in package._dependantFolders) {
104 foreach (var subFile
in Directory.GetFiles(folder,
"*", SearchOption.AllDirectories)) {
112 var packagePaths =
new HashSet<string>(FindAll().Select(package => Path.GetFullPath(AssetDatabase.GetAssetPath(package))));
120 var filteredAssets = assets.Where(path =>
File.Exists(path)).
121 Where(path => !packagePaths.Contains(Path.GetFullPath(path))).
122 Where(path => Path.GetExtension(path) !=
".meta").
123 Where(path => !
_ignoredFiles.Select(Path.GetFullPath).Contains(Path.GetFullPath(path))).
124 Where(path =>
_ignoredFolders.All(folder => !Path.GetFullPath(path).Contains(Path.GetFullPath(folder)))).
127 ExportPackageOptions options = ExportPackageOptions.Recurse;
129 options |= ExportPackageOptions.Interactive;
132 AssetDatabase.ExportPackage(filteredAssets, exportPath, options);
138 public void BuildAllChildPackages() {
139 List<PackageDefinition> childPackages = GetChildPackages();
140 childPackages.Add(
this);
142 buildPackages(childPackages.ToArray());
145 private void buildPackageSet(HashSet<PackageDefinition> packages) {
150 if (package ==
null) {
154 if (!packages.Contains(package)) {
155 packages.Add(package);
156 package.buildPackageSet(packages);
164 public List<PackageDefinition> GetChildPackages() {
165 List<PackageDefinition> children =
new List<PackageDefinition>();
166 var allPackages = FindAll();
169 HashSet<PackageDefinition> packages =
new HashSet<PackageDefinition>();
170 foreach (var package
in allPackages) {
171 package.buildPackageSet(packages);
172 if (packages.Contains(
this)) {
173 children.Add(package);
182 string validPath =
null;
184 for (
int i = 0; i < packages.Length; i++) {
185 var
package = packages[i];
187 if (EditorUtility.DisplayCancelableProgressBar(
"Building Packages",
"Building " + package.DefinitionName +
"...", i / (
float)packages.Length)) {
191 package.BuildPackage(interactive:
false);
192 package.TryGetPackageExportFolder(out validPath, promptIfNotDefined:
false);
193 }
catch (Exception e) {
194 UnityEngine.Debug.LogError(
"Exception thrown while trying to build package " + package.DefinitionName);
199 EditorUtility.ClearProgressBar();
201 if (validPath !=
null) {
202 Process.Start(validPath);
207 [MenuItem(
"Build/All Packages", priority = 0)]
208 private static void buildAllPackages() {
209 buildPackages(FindAll());
212 [MenuItem(
"Build/All Packages", priority = 0, validate =
true)]
213 private static bool validateBuildAllPackages() {
214 return FindAll().Length > 0;
PackageDefinition[] _dependantPackages
string[] _dependantFolders