public void Load(Package package) { TryLoadPackageIntoLibrary(package); var assemblies = LocalPackages.SelectMany(x => x.EnumerateAndLoadAssembliesInBinDirectory().Where(y => y.IsNodeLibrary)); PackagesLoaded?.Invoke(assemblies.Select(x => x.Assembly)); }
/// <summary> /// Loads and imports all packages. /// </summary> /// <param name="packages"></param> public void LoadPackages(IEnumerable <Package> packages) { foreach (var pkg in packages) { TryLoadPackageIntoLibrary(pkg); } var assemblies = LocalPackages.SelectMany(x => x.EnumerateAssembliesInBinDirectory().Where(y => y.IsNodeLibrary)); OnPackagesLoaded(assemblies.Select(x => x.Assembly)); }
/// <summary> /// Saves all packages and assets. /// </summary> /// <param name="log">The <see cref="LoggerResult"/> in which to report result.</param> public void Save(LoggerResult log) { bool packagesSaved = false; //var clock = Stopwatch.StartNew(); using (var profile = Profiler.Begin(PackageSessionProfilingKeys.Saving)) { try { // Grab all previous assets var previousAssets = new Dictionary <Guid, AssetItem>(); foreach (var assetItem in packagesCopy.SelectMany(package => package.Assets)) { previousAssets[assetItem.Id] = assetItem; } // Grab all new assets var newAssets = new Dictionary <Guid, AssetItem>(); foreach (var assetItem in LocalPackages.SelectMany(package => package.Assets)) { newAssets[assetItem.Id] = assetItem; } // Compute all assets that were removed var assetsOrPackagesToRemove = new Dictionary <UFile, object>(); foreach (var assetIt in previousAssets) { var asset = assetIt.Value; AssetItem newAsset; if (!newAssets.TryGetValue(assetIt.Key, out newAsset) || newAsset.Location != asset.Location) { assetsOrPackagesToRemove[asset.FullPath] = asset; } } // Compute packages that have been renamed // TODO: Disable for now, as not sure if we want to delete a previous package //foreach (var package in packagesCopy) //{ // var newPackage = packages.Find(package.Id); // if (newPackage != null && package.PackagePath != null && newPackage.PackagePath != package.PackagePath) // { // assetsOrPackagesToRemove[package.PackagePath] = package; // } //} // If package are not modified, return immediately if (!CheckModifiedPackages() && assetsOrPackagesToRemove.Count == 0) { return; } // Suspend tracking when saving as we don't want to receive // all notification events if (dependencies != null) { dependencies.BeginSavingSession(); } // Return immediately if there is any error if (log.HasErrors) { return; } // Delete previous files foreach (var fileIt in assetsOrPackagesToRemove) { var assetPath = fileIt.Key; var assetItemOrPackage = fileIt.Value; if (File.Exists(assetPath)) { try { File.Delete(assetPath); } catch (Exception ex) { var assetItem = assetItemOrPackage as AssetItem; if (assetItem != null) { log.Error(assetItem.Package, assetItem.ToReference(), AssetMessageCode.AssetCannotDelete, ex, assetPath); } else { var package = assetItemOrPackage as Package; if (package != null) { log.Error(package, null, AssetMessageCode.AssetCannotDelete, ex, assetPath); } } } } } // Save all dirty assets packagesCopy.Clear(); foreach (var package in LocalPackages) { // Save the package to disk and all its assets package.Save(log); // Clone the package (but not all assets inside, just the structure) var packageClone = package.Clone(false); packagesCopy.Add(packageClone); } packagesSaved = true; } finally { if (dependencies != null) { dependencies.EndSavingSession(); } // Once all packages and assets have been saved, we can save the solution (as we need to have fullpath to // be setup for the packages) if (packagesSaved) { PackageSessionHelper.SaveSolution(this, log); } } //System.Diagnostics.Trace.WriteLine("Elapsed saved: " + clock.ElapsedMilliseconds); IsDirty = false; } }