📄 abstractrunnantcommand.cs
字号:
//
// SharpDevelop NAnt add-in.
//
// Copyright (C) 2004 Matthew Ward
//
// This program is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either version 2 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
// Matthew Ward (mrward@users.sourceforge.net)
using ICSharpCode.Core.AddIns.Codons;
using ICSharpCode.NAntAddIn;
using ICSharpCode.NAntAddIn.Gui;
using ICSharpCode.SharpDevelop.Gui;
using ICSharpCode.SharpDevelop.Gui.Pads;
using ICSharpCode.SharpDevelop.Internal.Project;
using ICSharpCode.SharpDevelop.Services;
using System;
using System.IO;
using System.Windows.Forms;
namespace ICSharpCode.NAntAddIn.Commands
{
/// <summary>
/// The base class for all commands that run NAnt.
/// </summary>
public abstract class AbstractRunNAntCommand : AbstractMenuCommand
{
/// <summary>
/// The default NAnt build filename.
/// </summary>
public static readonly string DefaultBuildFileName = "default.build";
static MessageViewCategory category;
static NAntRunner runner;
public AbstractRunNAntCommand()
{
if (runner == null) {
runner = NAntRunnerSingleton.Runner;
runner.NAntExited += new NAntExitEventHandler(NAntExited);
runner.OutputLineReceived += new LineReceivedEventHandler(OutputLineReceived);
}
}
public override void Run()
{
}
/// <summary>
/// Gets the NAnt build filename from the selected project.
/// </summary>
/// <remarks>
/// <para>The basic logic is:</para>
/// <para>Look for a file called "default.build".</para>
/// <para>Look for a file named after the project
/// "<projectName>.build".</para>
/// <para>Look for the first ".build" file in the project.</para>
/// <para>If multiple ".build" files exist then, like NAnt,
/// this is an error, but currently we ignore this.</para>
/// <para>Note that this does not look in the project folder
/// for a .build file that is not added to the project.
/// </para>
/// </remarks>
/// <returns>The build filename for the project.</returns>
protected string GetProjectBuildFileName()
{
string fileName = String.Empty;
IProject project = SharpDevelopApplication.ProjectService.CurrentSelectedProject;;
// Look for "default.build".
string projectFileName = SharpDevelopApplication.ProjectService.GetFileName(project);
string buildFileName = Path.Combine(Path.GetDirectoryName(projectFileName), DefaultBuildFileName);
if (project.IsFileInProject(buildFileName)) {
fileName = buildFileName;
} else {
// Look for <projectname>.build
buildFileName = Path.ChangeExtension(projectFileName, Generator.NAntBuildFileExtension);
if (project.IsFileInProject(buildFileName)) {
fileName = buildFileName;
} else {
// Look for the first matching .build file.
ProjectFile projectFile = GetFirstMatchingFile(project, Generator.NAntBuildFileExtension);
if (projectFile != null) {
fileName = projectFile.Name;
} else {
throw new NAntAddInException(SharpDevelopApplication.StringParserService.Parse("${res:ICSharpCode.NAntAddIn.AbstractRunNAntCommand.NoBuildFileErrorText}"));
}
}
}
return fileName;
}
/// <summary>
/// Runs any pre-build steps such as saving changed files.
/// </summary>
protected void RunPreBuildSteps()
{
//SharpDevelopApplication.ProjectService.DoBeforeCompileAction();
SharpDevelopApplication.TaskService.Tasks.Clear();
SharpDevelopApplication.TaskService.NotifyTaskChange();
}
/// <summary>
/// Runs the default target in the NAnt build.
/// </summary>
/// <param name="buildFileName">The build file to run.</param>
/// <param name="workingDirectory">The working folder for NAnt.</param>
/// <param name="debug">Flag indicating whether to set the NAnt debug property.</param>
protected void RunBuild(string buildFileName, string workingDirectory, bool debug)
{
RunBuild(buildFileName, workingDirectory, debug, String.Empty, String.Empty);
}
protected void RunBuild(string buildFileName, string workingDirectory, bool debug, string target)
{
RunBuild(buildFileName, workingDirectory, debug, target, String.Empty);
}
/// <summary>
/// Runs the specified target in the NAnt build.
/// </summary>
/// <param name="buildFileName">The build file to run.</param>
/// <param name="workingDirectory">The working folder for NAnt.</param>
/// <param name="debug">Flag indicating whether to set the NAnt debug property.</param>
/// <param name="target">The NAnt target to run.</param>
/// <param name="args">Command line arguments to pass to NAnt.</param>
protected void RunBuild(string buildFileName, string workingDirectory, bool debug, string target, string args)
{
if (IsBuildRunning) {
throw new NAntAddInException(SharpDevelopApplication.StringParserService.Parse("${res:ICSharpCode.NAntAddIn.AbstractRunNAntCommand.BuildRunningErrorText}"));
}
Category.ClearText();
runner.BuildFileName = buildFileName;
runner.NAntFileName = AddInOptions.NAntFileName;
runner.Verbose = AddInOptions.Verbose;
runner.WorkingDirectory = workingDirectory;
runner.Quiet = AddInOptions.Quiet;
runner.ShowLogo = AddInOptions.ShowLogo;
runner.DebugMode = AddInOptions.DebugMode;
if (debug) {
runner.Arguments = String.Concat("-D:debug=true ", AddInOptions.NAntArguments, " ", args, " ", target);
} else {
runner.Arguments = String.Concat(AddInOptions.NAntArguments, " ", args, " ", target);
}
CategoryWriteLine(SharpDevelopApplication.StringParserService.Parse("${res:ICSharpCode.NAntAddIn.AbstractRunNAntCommand.RunningNAntMessage}"));
CategoryWriteLine(runner.CommandLine);
runner.Run();
}
/// <summary>
/// Gets any extra arguments from the NAnt pad's text box.
/// </summary>
/// <returns></returns>
protected string GetPadTextBoxArguments()
{
string arguments = String.Empty;
IWorkbench Workbench = ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.Workbench;
IPadContent PadContent = Workbench.GetPad(typeof(NAntPadContent));
if (PadContent != null) {
arguments = ((NAntPadContent)PadContent).Arguments;
}
return arguments;
}
/// <summary>
/// Stops the currently running build.
/// </summary>
protected void StopBuild()
{
if (IsBuildRunning) {
if (SharpDevelopApplication.MessageService.AskQuestion(SharpDevelopApplication.StringParserService.Parse("${res:ICSharpCode.NAntAddIn.AbstractRunNAntCommand.TerminateNAntQuestion}"))) {
runner.Stop();
CategoryWriteLine(SharpDevelopApplication.StringParserService.Parse("${res:ICSharpCode.NAntAddIn.AbstractRunNAntCommand.NAntStoppedMessage}"));
}
}
}
protected bool IsBuildRunning {
get {
return runner.IsRunning;
}
}
/// <summary>
/// Gets the NAnt message view output window.
/// </summary>
MessageViewCategory Category {
get {
if (category == null) {
category = new MessageViewCategory("NAnt", "NAnt");
CompilerMessageView cmv = (CompilerMessageView)WorkbenchSingleton.Workbench.GetPad(typeof(CompilerMessageView));
cmv.AddCategory(category);
}
return category;
}
}
/// <summary>
/// Writes a line of text to the output window.
/// </summary>
/// <param name="message"></param>
void CategoryWriteLine(string message)
{
Category.AppendText(String.Concat(message, Environment.NewLine));
}
/// <summary>
/// Looks for the first file that matches the specified
/// file extension.
/// </summary>
/// <param name="extension">A filename extension.</param>
/// <returns>A ProjectFile that has the specified extension,
/// or null.</returns>
ProjectFile GetFirstMatchingFile(IProject project, string extension)
{
ProjectFile matchedProjectFile = null;
foreach (ProjectFile projectFile in project.ProjectFiles) {
string projectFileNameExtension = Path.GetExtension(projectFile.Name);
if (String.Compare(projectFileNameExtension, extension, true) == 0) {
matchedProjectFile = projectFile;
break;
}
}
return matchedProjectFile;
}
/// <summary>
/// Displays the output from NAnt after it has exited.
/// </summary>
/// <param name="sender">The event source.</param>
/// <param name="e">The NAnt exit event arguments.</param>
void NAntExited(object sender, NAntExitEventArgs e)
{
// Update output window.
string outputText = String.Empty;
System.Diagnostics.Debug.Assert(e.Error.Length == 0);
outputText = String.Concat(outputText, e.Output);
// Update task list.
TaskCollection tasks = NAntOutputParser.Parse(outputText);
foreach (Task task in tasks) {
SharpDevelopApplication.TaskService.Tasks.Add(task);
}
// Bring task list to front.
if (tasks.Count > 0) {
SharpDevelopApplication.TaskService.NotifyTaskChange();
if ((bool)SharpDevelopApplication.PropertyService.GetProperty("SharpDevelop.ShowTaskListAfterBuild", true)) {
IWorkbench Workbench = ICSharpCode.SharpDevelop.Gui.WorkbenchSingleton.Workbench;
IPadContent PadContent = Workbench.GetPad(typeof(OpenTaskView));
if (PadContent != null) {
PadContent.BringPadToFront();
}
}
}
}
void OutputLineReceived(object sender, LineReceivedEventArgs e)
{
CategoryWriteLine(e.Line);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -