2011-02-26 89 views

回答

37

使用自定義的外部工具有一個簡單的方法(儘管不是所有滿意的)。

假設你的項目文件的以下修改:

<Target Name="CalledFromIde"> 
    <Error Text="Called from the IDE!" /> 
    </Target> 

轉到工具|外部工具,並添加一個這樣的:

Title:  Called from IDE 
    Command: C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe 
    Arguments: $(ProjectDir)$(ProjectFileName) /t:CalledFromIde 
    Initial directory: $(ProjectDir) 
    Use Output window: checked 

運行此產生輸出爲:

Build FAILED. 

    "F:\Code\CsProject\CsProject.csproj" (CalledFromIde target) (1) -> 
    (CalledFromIde target) -> 
    F:\Code\CsProject\CsProject.csproj(57,5): error : Called from the IDE! 

你在做什麼在呼喚出來的MSBuild作爲外部工具,並讓它直接運行的目標。您必須提供MSBuild的完整路徑,因爲IDE不會保留與其創建的構建環境相同的屬性。

您可以通過計算出它在Tools.ExternalCommand#集合中的哪個命令#來將它連接到快捷方式。

如果您正在尋找一個更復雜的解決方案,它會涉及更多一點。這裏簡單地說(VS2010):

1)創建一個VS Addin(File | New | Project | Other Project Types | Extensibility | Visual Studio Add-in)。我不確定您是否必須安裝VS SDK才能獲得該版本,它可以在擴展管理器中找到。

在嚮導中選擇下列選項: - 微軟的Visual Studio 2010 - 是的,創建「工具」菜單項 - 加載應用程序啓動時 - 我的外接絕不會容忍模式UI,和可以與命令行構建一起使用。

2)添加引用Microsoft.Build和Microsoft.Build.Framework

3)查找Exec的在Connect.cs實現文件

4)替換爲以下代碼:

public void Exec(
    string commandName, 
    vsCommandExecOption executeOption, 
    ref object varIn, 
    ref object varOut, 
    ref bool handled) 
{ 
    handled = false; 
    if (executeOption != vsCommandExecOption.vsCommandExecOptionDoDefault) 
     return; 
    if (commandName != "BuildAddin.Connect.BuildAddin") 
     return; 

    var doc = _applicationObject.ActiveDocument; 
    var projectItem = doc.ProjectItem; 
    var project = projectItem.ContainingProject; 
    var evalProject = 
     Microsoft.Build.Evaluation.ProjectCollection 
     .GlobalProjectCollection.LoadProject(project.FullName); 
    var execProject = evalProject.CreateProjectInstance(); 

    bool success = execProject.Build("CalledFromIde", null); 

    var window = _applicationObject.Windows.Item(Constants.vsWindowKindOutput); 
    var output = (OutputWindow)window.Object; 
    OutputWindowPane pane = output.OutputWindowPanes.Add("BuildAddin"); 
    pane.OutputString(success ? "built /t:CalledFromIde" : "build failed"); 

    handled = true; 
    return; 
} 

5)在調試好自定義的目標,因爲以前的一個錯誤:

<Target Name="CalledFromIde"> 
    <WriteLinesToFile File="CalledFromIde.txt" Lines="Called from the IDE!" /> 
    </Target> 

6)爲簡潔起見,上面的代碼沒有錯誤檢查,因爲它將在IDE中運行,所以您希望更清潔。插件會在你的工具菜單上放置一個菜單項。如上所述,它只是尋找包含當前活動編輯器文檔的項目,無論你做什麼,都需要更好的管道。

該技巧從IDE中獲取構建引擎實例,並使其在單獨的項目實例上執行構建。

2

你不必用Exec編寫代碼,儘管這是一種方法。更簡單的方法是做到以下幾點:

更改DefaultTargets="Build"屬性自定義目標創建,說"All"像這樣:

DefaultTargets="All" 

然後在您的自定義的「所有」目標,您可以使用DependsOnTargets屬性,如下所示:

"<Target Name="All" DependsOnTargets="ZipOutputFiles;Build"> 
    </Target>" 

然後,這將建立和出把zip文件在您的自定義"All"目標。

3

如果您在Visual Studio中運行構建,則在構建期間將會有VisualStudioDir的構建變量。

僅執行是VS建立會話做到這一點:

<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' != ''> 
</Target> 

要只在VS之外構建執行此操作:

<Target Name="Test" BeforeTargets="Build" Condition="'$(VisualStudioDir)' == ''> 
</Target> 

您將需要包括您的自定義目標文件以兩種方式之一。

  1. 設置環境變量CustomBeforeMicrosoftCommonTargets
  2. 編輯你的項目文件中加入進口

    <Imports Project="CustomBuildTasks.Targets"><Imports/> 
    
,包括您的自定義目標文件