public bool Execute() { var projectFile = ResolveProjectFile(); if (string.IsNullOrEmpty(projectFile)) { return false; } _solutionRoot = ProjectResolver.ResolveRootDirectory(projectFile); var globalFile = GlobalSettings.GetGlobalFilePath(_solutionRoot); if (!File.Exists(globalFile)) { _reports.WriteError($"The '{GlobalSettings.GlobalFileName}' is missing from '{_solutionRoot}'."); return false; } var packagesFolder = ResolvePackagesFolder(); if (string.IsNullOrEmpty(packagesFolder)) { return false; } var packageVersion = ResolvePackageVersion(projectFile); if (packageVersion == null) { return false; } var packageResolver = new DefaultPackagePathResolver(packagesFolder); var packageFolder = packageResolver.GetPackageDirectory(_packageId, packageVersion); packageFolder = Path.Combine(packagesFolder, packageFolder); var snapshotInfo = ReadRepositoryInfo(packageFolder); if (snapshotInfo == null) { return false; } string repoType; if (!snapshotInfo.TryGetValue(Constants.RepoTypeKey, out repoType)) { _reports.WriteError("Repository type information is missing from the repository information file."); return false; } var provider = SourceControlProviderFactory.ResolveProvider(repoType, _reports); if (provider == null) { _reports.WriteError($"Unknown repository type '{repoType}'"); return false; } if (!provider.IsInstalled) { _reports.WriteError($"The '{repoType}' client application is not installed."); return false; } var sourcesFolder = ResolveSourcesFolder(); var sourceFolderName = provider.CreateShortFolderName(snapshotInfo); var sourceDestinationFullPath = Path.Combine(sourcesFolder, sourceFolderName); if (!Directory.Exists(sourceDestinationFullPath)) { _reports.WriteInformation($"Downloading sources in '{sourceDestinationFullPath}'..."); if (!provider.GetSources(sourceDestinationFullPath, snapshotInfo)) { return false; } } else { _reports.WriteInformation($"Sources already found in '{sourceDestinationFullPath}'"); } var srcFolder = provider.GetSourceFolderPath(snapshotInfo); srcFolder = Path.Combine(sourceDestinationFullPath, srcFolder); if (!Directory.Exists(srcFolder)) { _reports.WriteError($"The source code folder '{srcFolder}' is missing."); return false; } _reports.Verbose.WriteLine($"Updating {GlobalSettings.GlobalFileName}..."); ModifyJson(globalFile, jObj => { var projects = jObj["projects"] as JArray; if (projects == null) { projects = new JArray(); projects.Add(srcFolder); jObj.Add("projects", projects); } else { if (!projects.Any(t => t.ToString().Equals(srcFolder))) { projects.Add(srcFolder); } } }); return true; }
private bool EmitNupkg(PublishRoot root) { root.Reports.Quiet.WriteLine(" Packing nupkg from {0} dependency {1}", _libraryDescription.Type, _libraryDescription.Identity.Name); IsPackage = true; var project = GetCurrentProject(); var resolver = new DefaultPackagePathResolver(root.TargetPackagesPath); var targetNupkg = resolver.GetPackageFileName(project.Name, project.Version); TargetPath = resolver.GetInstallPath(project.Name, project.Version); root.Reports.Quiet.WriteLine(" Source {0}", _libraryDescription.Path.Bold()); root.Reports.Quiet.WriteLine(" Target {0}", TargetPath); if (Directory.Exists(TargetPath)) { root.Operations.Delete(TargetPath); } // Generate nupkg from this project dependency var buildOptions = new BuildOptions(); buildOptions.ProjectPatterns.Add(project.ProjectDirectory); buildOptions.OutputDir = Path.Combine(project.ProjectDirectory, "bin"); buildOptions.Configurations.Add(root.Configuration); buildOptions.GeneratePackages = true; buildOptions.Reports = root.Reports.ShallowCopy(); // Mute "dnu pack" completely if it is invoked by "dnu publish --quiet" buildOptions.Reports.Information = root.Reports.Quiet; var buildManager = new BuildManager(root.HostServices, buildOptions); if (!buildManager.Build()) { return false; } // Extract the generated nupkg to target path var srcNupkgPath = Path.Combine(buildOptions.OutputDir, root.Configuration, targetNupkg); var srcSymbolsNupkgPath = Path.ChangeExtension(srcNupkgPath, "symbols.nupkg"); var options = new Microsoft.Framework.PackageManager.Packages.AddOptions { NuGetPackage = root.IncludeSymbols ? srcSymbolsNupkgPath : srcNupkgPath, SourcePackages = root.TargetPackagesPath, Reports = root.Reports }; var packagesAddCommand = new Microsoft.Framework.PackageManager.Packages.AddCommand(options); packagesAddCommand.Execute().GetAwaiter().GetResult(); // Copy content files (e.g. html, js and images) of main project into "root" folder of the exported package var rootFolderPath = Path.Combine(TargetPath, "root"); var rootProjectJson = Path.Combine(rootFolderPath, Runtime.Project.ProjectFileName); root.Operations.Delete(rootFolderPath); CopyProject(root, project, rootFolderPath, includeSource: false); UpdateWebRoot(root, rootFolderPath); UpdateJson(rootProjectJson, jsonObj => { // Update the project entrypoint jsonObj["entryPoint"] = _libraryDescription.Identity.Name; // Set mark this as non loadable jsonObj["loadable"] = false; // Update the dependencies node to reference the main project var deps = new JObject(); jsonObj["dependencies"] = deps; deps[_libraryDescription.Identity.Name] = _libraryDescription.Identity.Version.ToString(); }); var appBase = Path.Combine(PublishRoot.AppRootName, "packages", resolver.GetPackageDirectory(_libraryDescription.Identity.Name, _libraryDescription.Identity.Version), "root"); _relativeAppBase = Path.Combine("..", appBase); ApplicationBasePath = Path.Combine(root.OutputPath, appBase); root.Reports.Quiet.WriteLine("Removing {0}", srcNupkgPath); File.Delete(srcNupkgPath); root.Reports.Quiet.WriteLine("Removing {0}", srcSymbolsNupkgPath); File.Delete(srcSymbolsNupkgPath); return true; }
private bool EmitNupkg(PublishRoot root) { root.Reports.Quiet.WriteLine(" Packing nupkg from {0} dependency {1}", _projectDescription.Type, _projectDescription.Identity.Name); IsPackage = true; var project = GetCurrentProject(); if (project == null) { return false; } var resolver = new DefaultPackagePathResolver(root.TargetPackagesPath); var targetNupkg = resolver.GetPackageFileName(project.Name, project.Version); TargetPath = resolver.GetInstallPath(project.Name, project.Version); root.Reports.Quiet.WriteLine(" Source {0}", _projectDescription.Path.Bold()); root.Reports.Quiet.WriteLine(" Target {0}", TargetPath); if (Directory.Exists(TargetPath)) { root.Operations.Delete(TargetPath); } // If this is a wrapper project, we need to generate a lock file before building it if (IsWrappingAssembly()) { var success = Restore(root, publishProject: this, restoreDirectory: project.ProjectDirectory) .GetAwaiter().GetResult(); if (!success) { return false; } } // Generate nupkg from this project dependency var buildOptions = new BuildOptions(); buildOptions.ProjectPatterns.Add(project.ProjectDirectory); buildOptions.OutputDir = Path.Combine(project.ProjectDirectory, "bin"); buildOptions.Configurations.Add(root.Configuration); buildOptions.GeneratePackages = true; buildOptions.Reports = root.Reports.ShallowCopy(); if (root.Frameworks.Any()) { // Make sure we only emit the nupkgs for the specified frameworks // We need to pick actual project frameworks relevant to the publish // but the project may not target exactly the right framework so we need // to use a compatibility check. foreach (var framework in root.Frameworks) { var selectedFramework = project.GetCompatibleTargetFramework(framework.Key); if (selectedFramework == null) { root.Reports.WriteError($"Unable to build {project.Name}. It is not compatible with the requested target framework: {framework.Key}"); return false; } buildOptions.TargetFrameworks.Add(selectedFramework.FrameworkName, VersionUtility.GetShortFrameworkName(selectedFramework.FrameworkName)); } } // Mute "dnu pack" completely if it is invoked by "dnu publish --quiet" buildOptions.Reports.Information = root.Reports.Quiet; var buildManager = new BuildManager(root.HostServices, buildOptions); if (!buildManager.Build()) { return false; } // Extract the generated nupkg to target path var srcNupkgPath = Path.Combine(buildOptions.OutputDir, root.Configuration, targetNupkg); var srcSymbolsNupkgPath = Path.ChangeExtension(srcNupkgPath, "symbols.nupkg"); var options = new Packages.AddOptions { NuGetPackage = root.IncludeSymbols ? srcSymbolsNupkgPath : srcNupkgPath, SourcePackages = root.TargetPackagesPath, Reports = root.Reports }; var packagesAddCommand = new Packages.AddCommand(options); packagesAddCommand.Execute().GetAwaiter().GetResult(); // Copy content files (e.g. html, js and images) of main project into "root" folder of the exported package var rootFolderPath = Path.Combine(TargetPath, "root"); var rootProjectJson = Path.Combine(rootFolderPath, Runtime.Project.ProjectFileName); root.Operations.Delete(rootFolderPath); CopyProject(root, project, rootFolderPath, includeSource: false); UpdateWebRoot(root, rootFolderPath); UpdateJson(rootProjectJson, jsonObj => { // Update the project entrypoint jsonObj["entryPoint"] = _projectDescription.Identity.Name; // Set mark this as non loadable jsonObj["loadable"] = false; // Update the dependencies node to reference the main project var deps = new JObject(); jsonObj["dependencies"] = deps; deps[_projectDescription.Identity.Name] = _projectDescription.Identity.Version.ToString(); }); var appBase = Path.Combine(PublishRoot.AppRootName, "packages", resolver.GetPackageDirectory(_projectDescription.Identity.Name, _projectDescription.Identity.Version), "root"); _relativeAppBase = Path.Combine("..", appBase); ApplicationBasePath = Path.Combine(root.OutputPath, appBase); root.Reports.Quiet.WriteLine("Removing {0}", srcNupkgPath); File.Delete(srcNupkgPath); root.Reports.Quiet.WriteLine("Removing {0}", srcSymbolsNupkgPath); File.Delete(srcSymbolsNupkgPath); return true; }
private bool EmitNupkg(PublishRoot root) { root.Reports.Quiet.WriteLine(" Packing nupkg from {0} dependency {1}", _libraryDescription.Type, _libraryDescription.Identity.Name); IsPackage = true; var project = GetCurrentProject(); var resolver = new DefaultPackagePathResolver(root.TargetPackagesPath); var targetNupkg = resolver.GetPackageFileName(project.Name, project.Version); TargetPath = resolver.GetInstallPath(project.Name, project.Version); root.Reports.Quiet.WriteLine(" Source {0}", _libraryDescription.Path.Bold()); root.Reports.Quiet.WriteLine(" Target {0}", TargetPath); if (Directory.Exists(TargetPath)) { root.Operations.Delete(TargetPath); } // Generate nupkg from this project dependency var buildOptions = new BuildOptions(); buildOptions.ProjectDir = project.ProjectDirectory; buildOptions.OutputDir = Path.Combine(project.ProjectDirectory, "bin"); buildOptions.Configurations.Add(root.Configuration); buildOptions.Reports = root.Reports; buildOptions.GeneratePackages = true; var buildManager = new BuildManager(root.HostServices, buildOptions); if (!buildManager.Build()) { return false; } // Extract the generated nupkg to target path var srcNupkgPath = Path.Combine(buildOptions.OutputDir, root.Configuration, targetNupkg); var targetNupkgPath = resolver.GetPackageFilePath(project.Name, project.Version); var hashFile = resolver.GetHashPath(project.Name, project.Version); using (var sourceStream = new FileStream(srcNupkgPath, FileMode.Open, FileAccess.Read)) { using (var archive = new ZipArchive(sourceStream, ZipArchiveMode.Read)) { root.Operations.ExtractNupkg(archive, TargetPath); } } using (var sourceStream = new FileStream(srcNupkgPath, FileMode.Open, FileAccess.Read)) { using (var targetStream = new FileStream(targetNupkgPath, FileMode.Create, FileAccess.Write, FileShare.None)) { sourceStream.CopyTo(targetStream); } sourceStream.Seek(0, SeekOrigin.Begin); var sha512Bytes = SHA512.Create().ComputeHash(sourceStream); File.WriteAllText(hashFile, Convert.ToBase64String(sha512Bytes)); } // Copy content files (e.g. html, js and images) of main project into "root" folder of the exported package var rootFolderPath = Path.Combine(TargetPath, "root"); var rootProjectJson = Path.Combine(rootFolderPath, Runtime.Project.ProjectFileName); root.Operations.Delete(rootFolderPath); CopyProject(root, project, rootFolderPath, includeSource: false); UpdateWebRoot(root, rootFolderPath); UpdateJson(rootProjectJson, jsonObj => { // Update the project entrypoint jsonObj["entryPoint"] = _libraryDescription.Identity.Name; // Set mark this as non loadable jsonObj["loadable"] = false; // Update the dependencies node to reference the main project var deps = new JObject(); jsonObj["dependencies"] = deps; deps[_libraryDescription.Identity.Name] = _libraryDescription.Identity.Version.ToString(); }); _applicationBase = Path.Combine("..", PublishRoot.AppRootName, "packages", resolver.GetPackageDirectory(_libraryDescription.Identity.Name, _libraryDescription.Identity.Version), "root"); root.Reports.Quiet.WriteLine("Removing {0}", srcNupkgPath); File.Delete(srcNupkgPath); srcNupkgPath = Path.ChangeExtension(srcNupkgPath, "symbols.nupkg"); root.Reports.Quiet.WriteLine("Removing {0}", srcNupkgPath); File.Delete(srcNupkgPath); return true; }