private void StartAndAttachDebugger(string file, string nodePath, bool startBrowser) { // start the node process var workingDir = _project.GetWorkingDirectory(); var url = GetFullUrl(); var env = GetEnvironmentVariablesString(url); var interpreterOptions = _project.GetProjectProperty(NodeProjectProperty.NodeExeArguments); var debugOptions = this.GetDebugOptions(); var script = GetFullArguments(file, includeNodeArgs: false); var process = NodeDebugger.StartNodeProcessWithInspect(exe: nodePath, script: script, dir: workingDir, env: env, interpreterOptions: interpreterOptions, debugOptions: debugOptions); process.Start(); // setup debug info and attach var debugUri = $"http://127.0.0.1:{process.DebuggerPort}"; var dbgInfo = new VsDebugTargetInfo4(); dbgInfo.dlo = (uint)DEBUG_LAUNCH_OPERATION.DLO_AlreadyRunning; dbgInfo.LaunchFlags = (uint)__VSDBGLAUNCHFLAGS.DBGLAUNCH_StopDebuggingOnEnd; dbgInfo.guidLaunchDebugEngine = WebkitDebuggerGuid; dbgInfo.dwDebugEngineCount = 1; var enginesPtr = MarshalDebugEngines(new[] { WebkitDebuggerGuid }); dbgInfo.pDebugEngines = enginesPtr; dbgInfo.guidPortSupplier = WebkitPortSupplierGuid; dbgInfo.bstrPortName = debugUri; dbgInfo.fSendToOutputWindow = 0; // we connect through a URI, so no need to set the process, // we need to set the process id to '1' so the debugger is able to attach dbgInfo.bstrExe = $"\01"; AttachDebugger(dbgInfo); if (startBrowser) { Uri uri = null; if (!String.IsNullOrWhiteSpace(url)) { uri = new Uri(url); } if (uri != null) { OnPortOpenedHandler.CreateHandler( uri.Port, shortCircuitPredicate: () => process.HasExited, action: () => { VsShellUtilities.OpenBrowser(url, (uint)__VSOSPFLAGS.OSP_LaunchNewBrowser); } ); } } }
private int Start(string file, bool debug) { string nodePath = GetNodePath(); if (nodePath == null) { Nodejs.ShowNodejsNotInstalled(); return(VSConstants.S_OK); } bool startBrowser = ShouldStartBrowser(); if (debug) { StartWithDebugger(file); } else { var psi = new ProcessStartInfo(); psi.UseShellExecute = false; psi.FileName = nodePath; psi.Arguments = GetFullArguments(file); psi.WorkingDirectory = _project.GetWorkingDirectory(); string webBrowserUrl = GetFullUrl(); Uri uri = null; if (!String.IsNullOrWhiteSpace(webBrowserUrl)) { uri = new Uri(webBrowserUrl); psi.EnvironmentVariables["PORT"] = uri.Port.ToString(); } foreach (var nameValue in GetEnvironmentVariables()) { psi.EnvironmentVariables[nameValue.Key] = nameValue.Value; } var process = NodeProcess.Start( psi, NodejsPackage.Instance.GeneralOptionsPage.WaitOnAbnormalExit, NodejsPackage.Instance.GeneralOptionsPage.WaitOnNormalExit); _project.OnDispose += process.ResponseToTerminateEvent; if (startBrowser && uri != null) { OnPortOpenedHandler.CreateHandler( uri.Port, shortCircuitPredicate: () => process.HasExited, action: () => { VsShellUtilities.OpenBrowser(webBrowserUrl, (uint)__VSOSPFLAGS.OSP_LaunchNewBrowser); } ); } } return(VSConstants.S_OK); }
private void StartNodeProcess(string file, string nodePath, bool startBrowser) { //TODO: looks like this duplicates a bunch of code in NodeDebugger var psi = new ProcessStartInfo() { UseShellExecute = false, FileName = nodePath, Arguments = GetFullArguments(file, includeNodeArgs: true), WorkingDirectory = _project.GetWorkingDirectory() }; var webBrowserUrl = GetFullUrl(); Uri uri = null; if (!String.IsNullOrWhiteSpace(webBrowserUrl)) { uri = new Uri(webBrowserUrl); psi.EnvironmentVariables["PORT"] = uri.Port.ToString(); } foreach (var nameValue in GetEnvironmentVariables()) { psi.EnvironmentVariables[nameValue.Key] = nameValue.Value; } var process = NodeProcess.Start( psi, waitOnAbnormal: NodejsPackage.Instance.GeneralOptionsPage.WaitOnAbnormalExit, waitOnNormal: NodejsPackage.Instance.GeneralOptionsPage.WaitOnNormalExit); this._project.OnDispose += process.ResponseToTerminateEvent; if (startBrowser && uri != null) { OnPortOpenedHandler.CreateHandler( uri.Port, shortCircuitPredicate: () => process.HasExited, action: () => { VsShellUtilities.OpenBrowser(webBrowserUrl, (uint)__VSOSPFLAGS.OSP_LaunchNewBrowser); } ); } }
private void StartAndAttachDebugger(string file, string nodePath) { // start the node process var workingDir = _project.GetWorkingDirectory(); var url = GetFullUrl(); var env = GetEnvironmentVariablesString(url); var interpreterOptions = _project.GetProjectProperty(NodeProjectProperty.NodeExeArguments); var debugOptions = this.GetDebugOptions(); var script = GetFullArguments(file, includeNodeArgs: false); var process = NodeDebugger.StartNodeProcessWithInspect(exe: nodePath, script: script, dir: workingDir, env: env, interpreterOptions: interpreterOptions, debugOptions: debugOptions); process.Start(); // setup debug info and attach var debugUri = $"http://127.0.0.1:{process.DebuggerPort}"; var dbgInfo = new VsDebugTargetInfo4(); dbgInfo.dlo = (uint)DEBUG_LAUNCH_OPERATION.DLO_AlreadyRunning; dbgInfo.LaunchFlags = (uint)__VSDBGLAUNCHFLAGS.DBGLAUNCH_StopDebuggingOnEnd; dbgInfo.guidLaunchDebugEngine = WebkitDebuggerGuid; dbgInfo.dwDebugEngineCount = 1; var enginesPtr = MarshalDebugEngines(new[] { WebkitDebuggerGuid }); dbgInfo.pDebugEngines = enginesPtr; dbgInfo.guidPortSupplier = WebkitPortSupplierGuid; dbgInfo.bstrPortName = debugUri; dbgInfo.fSendToOutputWindow = 0; // we connect through a URI, so no need to set the process, // we need to set the process id to '1' so the debugger is able to attach dbgInfo.bstrExe = $"\01"; AttachDebugger(dbgInfo); }