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(); }