private static bool TryLoadAssets(PackageSession session, ILogger log, Package package, PackageLoadParameters loadParameters) { // Already loaded if (package.State >= PackageState.AssetsReady) return true; // Dependencies could not properly be loaded if (package.State < PackageState.DependenciesReady) return false; // A package upgrade has previously been tried and denied, so let's keep the package in this state if (package.State == PackageState.UpgradeFailed) return false; try { // First, check that dependencies have their assets loaded bool dependencyError = false; foreach (var dependency in package.FindDependencies(false, false)) { if (!TryLoadAssets(session, log, dependency, loadParameters)) dependencyError = true; } if (dependencyError) return false; var pendingPackageUpgrades = new List<PendingPackageUpgrade>(); // Note: Default state is upgrade failed (for early exit on error/exceptions) // We will update to success as soon as loading is finished. package.State = PackageState.UpgradeFailed; // Process store dependencies for upgraders foreach (var packageDependency in package.Meta.Dependencies) { var dependencyPackage = session.Packages.Find(packageDependency); if (dependencyPackage == null) { continue; } // Check for upgraders var packageUpgrader = session.CheckPackageUpgrade(log, package, packageDependency, dependencyPackage); if (packageUpgrader != null) { pendingPackageUpgrades.Add(new PendingPackageUpgrade(packageUpgrader, packageDependency, dependencyPackage)); } } // Prepare asset loading var newLoadParameters = loadParameters.Clone(); newLoadParameters.AssemblyContainer = session.assemblyContainer; // Default package version override newLoadParameters.ExtraCompileProperties = new Dictionary<string, string>(); var defaultPackageOverride = NugetStore.GetPackageVersionVariable(PackageStore.Instance.DefaultPackageName) + "Override"; var defaultPackageVersion = PackageStore.Instance.DefaultPackageVersion.Version; newLoadParameters.ExtraCompileProperties.Add(defaultPackageOverride, new Version(defaultPackageVersion.Major, defaultPackageVersion.Minor).ToString()); if (loadParameters.ExtraCompileProperties != null) { foreach (var property in loadParameters.ExtraCompileProperties) { newLoadParameters.ExtraCompileProperties[property.Key] = property.Value; } } if (pendingPackageUpgrades.Count > 0) { var upgradeAllowed = true; // Need upgrades, let's ask user confirmation if (loadParameters.PackageUpgradeRequested != null) { upgradeAllowed = loadParameters.PackageUpgradeRequested(package, pendingPackageUpgrades); } if (!upgradeAllowed) { log.Error("Necessary package migration for [{0}] has not been allowed", package.Meta.Name); return false; } // Perform pre assembly load upgrade foreach (var pendingPackageUpgrade in pendingPackageUpgrades) { var packageUpgrader = pendingPackageUpgrade.PackageUpgrader; var dependencyPackage = pendingPackageUpgrade.DependencyPackage; if (!packageUpgrader.UpgradeBeforeAssembliesLoaded(session, log, package, pendingPackageUpgrade.Dependency, dependencyPackage)) { log.Error("Error while upgrading package [{0}] for [{1}] from version [{2}] to [{3}]", package.Meta.Name, dependencyPackage.Meta.Name, pendingPackageUpgrade.Dependency.Version, dependencyPackage.Meta.Version); return false; } } } // Load assemblies. Set the package filename to the path on disk, in case of renaming. // TODO: Could referenced projects be associated to other packages than this one? newLoadParameters.ExtraCompileProperties.Add("SiliconStudioCurrentPackagePath", package.FullPath); package.LoadAssemblies(log, newLoadParameters); // Load list of assets newLoadParameters.AssetFiles = Package.ListAssetFiles(log, package, loadParameters.CancelToken); if (pendingPackageUpgrades.Count > 0) { // Perform upgrades foreach (var pendingPackageUpgrade in pendingPackageUpgrades) { var packageUpgrader = pendingPackageUpgrade.PackageUpgrader; var dependencyPackage = pendingPackageUpgrade.DependencyPackage; if (!packageUpgrader.Upgrade(session, log, package, pendingPackageUpgrade.Dependency, dependencyPackage, newLoadParameters.AssetFiles)) { log.Error("Error while upgrading package [{0}] for [{1}] from version [{2}] to [{3}]", package.Meta.Name, dependencyPackage.Meta.Name, pendingPackageUpgrade.Dependency.Version, dependencyPackage.Meta.Version); return false; } // Update dependency to reflect new requirement pendingPackageUpgrade.Dependency.Version = pendingPackageUpgrade.PackageUpgrader.Attribute.PackageUpdatedVersionRange; } // Mark package as dirty package.IsDirty = true; } // Load assets package.LoadAssets(log, newLoadParameters); // Validate assets from package package.ValidateAssets(newLoadParameters.GenerateNewAssetIds); if (pendingPackageUpgrades.Count > 0) { // Perform post asset load upgrade foreach (var pendingPackageUpgrade in pendingPackageUpgrades) { var packageUpgrader = pendingPackageUpgrade.PackageUpgrader; var dependencyPackage = pendingPackageUpgrade.DependencyPackage; if (!packageUpgrader.UpgradeAfterAssetsLoaded(session, log, package, pendingPackageUpgrade.Dependency, dependencyPackage, pendingPackageUpgrade.DependencyVersionBeforeUpgrade)) { log.Error("Error while upgrading package [{0}] for [{1}] from version [{2}] to [{3}]", package.Meta.Name, dependencyPackage.Meta.Name, pendingPackageUpgrade.Dependency.Version, dependencyPackage.Meta.Version); return false; } } // Mark package as dirty package.IsDirty = true; } // Mark package as ready package.State = PackageState.AssetsReady; // Freeze the package after loading the assets session.FreezePackage(package); return true; } catch (Exception ex) { log.Error("Error while loading package [{0}]", ex, package); return false; } }
private static Package PreLoadPackage(PackageSession session, ILogger log, string filePath, bool isSystemPackage, PackageCollection loadedPackages, PackageLoadParameters loadParameters) { if (session == null) { throw new ArgumentNullException("session"); } if (log == null) { throw new ArgumentNullException("log"); } if (filePath == null) { throw new ArgumentNullException("filePath"); } if (loadedPackages == null) { throw new ArgumentNullException("loadedPackages"); } if (loadParameters == null) { throw new ArgumentNullException("loadParameters"); } try { var packageId = Package.GetPackageIdFromFile(filePath); // Check that the package was not already loaded, otherwise return the same instance if (session.Packages.ContainsById(packageId)) { return(session.Packages.Find(packageId)); } // Package is already loaded, use the instance if (loadedPackages.ContainsById(packageId)) { return(loadedPackages.Find(packageId)); } // Load the package without loading assets var newLoadParameters = loadParameters.Clone(); newLoadParameters.AssemblyContainer = session.assemblyContainer; // Load the package var package = Package.Load(log, filePath, newLoadParameters); package.IsSystem = isSystemPackage; // Add the package has loaded before loading dependencies loadedPackages.Add(package); // Load package dependencies PreLoadPackageDependencies(session, log, package, loadedPackages, loadParameters); // Add the package to the session but don't freeze it yet session.Packages.Add(package); // Validate assets from package package.ValidateAssets(loadParameters.GenerateNewAssetIds); // Freeze the package after loading the assets session.FreezePackage(package); return(package); } catch (Exception ex) { log.Error("Error while pre-loading package [{0}]", ex, filePath); } return(null); }
private static bool TryLoadAssets(PackageSession session, ILogger log, Package package, PackageLoadParameters loadParameters) { // Already loaded if (package.State >= PackageState.AssetsReady) { return(true); } // Dependencies could not properly be loaded if (package.State < PackageState.DependenciesReady) { return(false); } // A package upgrade has previously been tried and denied, so let's keep the package in this state if (package.State == PackageState.UpgradeFailed) { return(false); } try { // First, check that dependencies have their assets loaded bool dependencyError = false; foreach (var dependency in package.FindDependencies(false, false)) { if (!TryLoadAssets(session, log, dependency, loadParameters)) { dependencyError = true; } } if (dependencyError) { return(false); } var pendingPackageUpgrades = new List <PendingPackageUpgrade>(); // Note: Default state is upgrade failed (for early exit on error/exceptions) // We will update to success as soon as loading is finished. package.State = PackageState.UpgradeFailed; // Process store dependencies for upgraders foreach (var packageDependency in package.Meta.Dependencies) { var dependencyPackage = session.Packages.Find(packageDependency); if (dependencyPackage == null) { continue; } // Check for upgraders var packageUpgrader = session.CheckPackageUpgrade(log, package, packageDependency, dependencyPackage); if (packageUpgrader != null) { pendingPackageUpgrades.Add(new PendingPackageUpgrade(packageUpgrader, packageDependency, dependencyPackage)); } } // Load list of assets var assetFiles = Package.ListAssetFiles(log, package, loadParameters.CancelToken); if (pendingPackageUpgrades.Count > 0) { var upgradeAllowed = true; // Need upgrades, let's ask user confirmation if (loadParameters.PackageUpgradeRequested != null) { upgradeAllowed = loadParameters.PackageUpgradeRequested(package, pendingPackageUpgrades); } if (!upgradeAllowed) { log.Error("Necessary package migration for [{0}] has not been allowed", package.Meta.Name); return(false); } // Perform upgrades foreach (var pendingPackageUpgrade in pendingPackageUpgrades) { var packageUpgrader = pendingPackageUpgrade.PackageUpgrader; var dependencyPackage = pendingPackageUpgrade.DependencyPackage; if (!packageUpgrader.Upgrade(session, log, package, pendingPackageUpgrade.Dependency, dependencyPackage, assetFiles)) { log.Error("Error while upgrading package [{0}] for [{1}] from version [{2}] to [{3}]", package.Meta.Name, dependencyPackage.Meta.Name, pendingPackageUpgrade.Dependency.Version, dependencyPackage.Meta.Version); return(false); } // Update dependency to reflect new requirement pendingPackageUpgrade.Dependency.Version = pendingPackageUpgrade.PackageUpgrader.Attribute.PackageUpdatedVersionRange; } // Mark package as dirty package.IsDirty = true; } // Process the package for assets var newLoadParameters = loadParameters.Clone(); newLoadParameters.AssetFiles = assetFiles; newLoadParameters.AssemblyContainer = session.assemblyContainer; // Default package version override newLoadParameters.ExtraCompileProperties = new Dictionary <string, string>(); var defaultPackageOverride = NugetStore.GetPackageVersionVariable(PackageStore.Instance.DefaultPackageName) + "Override"; var defaultPackageVersion = PackageStore.Instance.DefaultPackageVersion.Version; newLoadParameters.ExtraCompileProperties.Add(defaultPackageOverride, new Version(defaultPackageVersion.Major, defaultPackageVersion.Minor).ToString()); if (loadParameters.ExtraCompileProperties != null) { foreach (var property in loadParameters.ExtraCompileProperties) { newLoadParameters.ExtraCompileProperties[property.Key] = property.Value; } } // Load assemblies and assets package.LoadAssembliesAndAssets(log, newLoadParameters); // Validate assets from package package.ValidateAssets(newLoadParameters.GenerateNewAssetIds); // Mark package as ready package.State = PackageState.AssetsReady; // Freeze the package after loading the assets session.FreezePackage(package); return(true); } catch (Exception ex) { log.Error("Error while loading package [{0}]", ex, package); return(false); } }
private static Package PreLoadPackage(PackageSession session, ILogger log, string filePath, bool isSystemPackage, PackageCollection loadedPackages, PackageLoadParameters loadParameters) { if (session == null) throw new ArgumentNullException("session"); if (log == null) throw new ArgumentNullException("log"); if (filePath == null) throw new ArgumentNullException("filePath"); if (loadedPackages == null) throw new ArgumentNullException("loadedPackages"); if (loadParameters == null) throw new ArgumentNullException("loadParameters"); try { var packageId = Package.GetPackageIdFromFile(filePath); // Check that the package was not already loaded, otherwise return the same instance if (session.Packages.ContainsById(packageId)) { return session.Packages.Find(packageId); } // Package is already loaded, use the instance if (loadedPackages.ContainsById(packageId)) { return loadedPackages.Find(packageId); } // Load the package without loading assets var newLoadParameters = loadParameters.Clone(); newLoadParameters.AssemblyContainer = session.assemblyContainer; // Load the package var package = Package.Load(log, filePath, newLoadParameters); package.IsSystem = isSystemPackage; // Add the package has loaded before loading dependencies loadedPackages.Add(package); // Package has been loaded, register it in constraints so that we force each subsequent loads to use this one (or fails if version doesn't match) session.constraintProvider.AddConstraint(package.Meta.Name, new VersionSpec(package.Meta.Version.ToSemanticVersion())); // Load package dependencies PreLoadPackageDependencies(session, log, package, loadedPackages, loadParameters); // Add the package to the session but don't freeze it yet session.Packages.Add(package); // Validate assets from package package.ValidateAssets(loadParameters.GenerateNewAssetIds); // Freeze the package after loading the assets session.FreezePackage(package); return package; } catch (Exception ex) { log.Error("Error while pre-loading package [{0}]", ex, filePath); } return null; }