private async Task <bool> ExecuteCoreAsync( PackageIdentity packageIdentity, string fullScriptPath, string packageInstallPath, EnvDTEProject envDTEProject, NuGetProject nuGetProject, INuGetProjectContext nuGetProjectContext, bool throwOnFailure) { if (File.Exists(fullScriptPath)) { if (fullScriptPath.EndsWith(PowerShellScripts.Init, StringComparison.OrdinalIgnoreCase) && !TryMarkVisited(packageIdentity, PackageInitPS1State.FoundAndExecuted)) { return(true); } ScriptPackage package = null; if (envDTEProject != null) { NuGetFramework targetFramework; nuGetProject.TryGetMetadata(NuGetProjectMetadataKeys.TargetFramework, out targetFramework); // targetFramework can be null for unknown project types string shortFramework = targetFramework?.GetShortFolderName() ?? string.Empty; nuGetProjectContext.Log(MessageLevel.Debug, Strings.Debug_TargetFrameworkInfoPrefix, packageIdentity, envDTEProject.Name, shortFramework); } if (packageIdentity != null) { package = new ScriptPackage(packageIdentity.Id, packageIdentity.Version.ToString(), packageInstallPath); } string toolsPath = Path.GetDirectoryName(fullScriptPath); IPSNuGetProjectContext psNuGetProjectContext = nuGetProjectContext as IPSNuGetProjectContext; if (psNuGetProjectContext != null && psNuGetProjectContext.IsExecuting && psNuGetProjectContext.CurrentPSCmdlet != null) { var psVariable = psNuGetProjectContext.CurrentPSCmdlet.SessionState.PSVariable; // set temp variables to pass to the script psVariable.Set("__rootPath", packageInstallPath); psVariable.Set("__toolsPath", toolsPath); psVariable.Set("__package", package); psVariable.Set("__project", envDTEProject); psNuGetProjectContext.ExecutePSScript(fullScriptPath, throwOnFailure); } else { string logMessage = String.Format(CultureInfo.CurrentCulture, Resources.ExecutingScript, fullScriptPath); // logging to both the Output window and progress window. nuGetProjectContext.Log(MessageLevel.Info, logMessage); try { await ExecuteScriptCoreAsync( package, packageInstallPath, fullScriptPath, toolsPath, envDTEProject); } catch (Exception ex) { // throwFailure is set by Package Manager. if (throwOnFailure) { throw; } nuGetProjectContext.Log(MessageLevel.Warning, ex.Message); } } return(true); } else { if (fullScriptPath.EndsWith(PowerShellScripts.Init, StringComparison.OrdinalIgnoreCase)) { TryMarkVisited(packageIdentity, PackageInitPS1State.NotFound); } } return(false); }
private async Task <bool> ExecuteCoreAsync( string fullScriptPath, string packageInstallPath, ZipArchive packageZipArchive, EnvDTEProject envDTEProject, NuGetProject nuGetProject, INuGetProjectContext nuGetProjectContext) { if (File.Exists(fullScriptPath)) { PackageIdentity packageIdentity = null; if (envDTEProject != null) { NuGetFramework targetFramework; nuGetProject.TryGetMetadata <NuGetFramework>(NuGetProjectMetadataKeys.TargetFramework, out targetFramework); // targetFramework can be null for unknown project types string shortFramework = targetFramework == null ? string.Empty : targetFramework.GetShortFolderName(); var packageReader = new PackageReader(packageZipArchive); packageIdentity = packageReader.GetIdentity(); nuGetProjectContext.Log(MessageLevel.Debug, NuGet.ProjectManagement.Strings.Debug_TargetFrameworkInfoPrefix, packageIdentity, envDTEProject.Name, shortFramework); //logger.Log(MessageLevel.Debug, NuGetResources.Debug_TargetFrameworkInfo_PowershellScripts, // Path.GetDirectoryName(scriptFile.Path), VersionUtility.GetTargetFrameworkLogString(scriptFile.TargetFramework)); } if (fullScriptPath.EndsWith(PowerShellScripts.Init, StringComparison.OrdinalIgnoreCase)) { _skipPSScriptExecution = await NuGetPackageManager.PackageExistsInAnotherNuGetProject(nuGetProject, packageIdentity, _solutionManager, CancellationToken.None); } else { _skipPSScriptExecution = false; } if (!_skipPSScriptExecution) { string toolsPath = Path.GetDirectoryName(fullScriptPath); IPSNuGetProjectContext psNuGetProjectContext = nuGetProjectContext as IPSNuGetProjectContext; if (psNuGetProjectContext != null && psNuGetProjectContext.IsExecuting && psNuGetProjectContext.CurrentPSCmdlet != null) { var psVariable = psNuGetProjectContext.CurrentPSCmdlet.SessionState.PSVariable; // set temp variables to pass to the script psVariable.Set("__rootPath", packageInstallPath); psVariable.Set("__toolsPath", toolsPath); psVariable.Set("__package", packageZipArchive); psVariable.Set("__project", envDTEProject); psNuGetProjectContext.ExecutePSScript(fullScriptPath); } else { string command = "$__pc_args=@(); $input|%{$__pc_args+=$_}; & " + PathUtility.EscapePSPath(fullScriptPath) + " $__pc_args[0] $__pc_args[1] $__pc_args[2] $__pc_args[3]; Remove-Variable __pc_args -Scope 0"; object[] inputs = new object[] { packageInstallPath, toolsPath, packageZipArchive, envDTEProject }; string logMessage = String.Format(CultureInfo.CurrentCulture, Resources.ExecutingScript, fullScriptPath); // logging to both the Output window and progress window. nuGetProjectContext.Log(MessageLevel.Info, logMessage); IConsole console = OutputConsoleProvider.CreateOutputConsole(requirePowerShellHost: true); Host.Execute(console, command, inputs); } return(true); } } return(false); }