Example #1
0
        public void Install(string packageId, string version, IProgress <ProgressMessage> progress)
        {
            var packageIdAndVersion = string.Join(" ", packageId, version);

            Report(progress, ProgressMessageLevel.Info, "Installing '{0}'.", packageIdAndVersion);

            var installedModules = GetModules();

            // Check if already installed
            if (installedModules.Any(m => m.Id == packageId))
            {
                Report(progress, ProgressMessageLevel.Error, "'{0}' is already installed.", packageId);
            }
            else
            {
                var sourcePackageFileName = GetPackageFileName(packageId, version);
                var sourcePackageFilePath = Path.Combine(_sourcePackagesPath, sourcePackageFileName);
                var sourcePackage         = OpenPackage(sourcePackageFilePath);

                if (sourcePackage == null)
                {
                    Report(progress, ProgressMessageLevel.Error, "Cannot open package '{0}'.", sourcePackageFilePath);
                }
                else
                {
                    if (CheckDependencies(sourcePackage, installedModules, progress))
                    {
                        // Unpack all files
                        var moduleDirectoryPath = Path.Combine(_manifestProvider.RootPath, sourcePackage.Id);
                        Report(progress, ProgressMessageLevel.Debug, "Copying files to '{0}'.", moduleDirectoryPath);
                        ProcessPackage(sourcePackageFilePath, moduleDirectoryPath, PackageAction.Install);

                        // Copy package to installed packages directory
                        var installedPackageFilePath = Path.Combine(_installedPackagesPath, sourcePackageFileName);
                        Report(progress, ProgressMessageLevel.Debug, "Copying package '{0}' to '{1}'.", sourcePackageFilePath, installedPackageFilePath);
                        EnsureDirectoryExists(installedPackageFilePath);
                        File.Copy(sourcePackageFilePath, installedPackageFilePath, true);

                        Report(progress, ProgressMessageLevel.Info, "Successfully installed '{0}'.", packageIdAndVersion);
                    }
                }
            }

            _manifestProvider.ClearCache();
        }