2011-02-26 9 views

Respuesta

37

Hay una manera simple (aunque no del todo satisfactoria) que utiliza una herramienta externa personalizada.

Suponiendo que el archivo de proyecto tiene la siguiente modificación:

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

Vaya a Herramientas | Herramientas externas y agregar uno como este:

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 

La ejecución de este produce una salida como:

Build FAILED. 

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

Lo que está haciendo es llamando a MSBuild como una herramienta externa y hacer que se ejecute el objetivo directamente. Debe proporcionar la ruta completa a MSBuild porque el IDE no mantiene las mismas propiedades que el entorno de compilación que crea tiene disponible.

Puede conectarlo a un atajo determinando qué comando # está en el conjunto Tools.ExternalCommand #.

Si está buscando una solución con más sofisticación, es un poco más complicado. Aquí está en pocas palabras (para VS2010):

1) Cree un complemento de VS (Archivo | Nuevo | Proyecto | Otros tipos de proyecto | Extensibilidad | Complemento de Visual Studio). No estoy seguro de si debe tener instalado VS SDK para obtenerlo; está disponible en el administrador de extensiones.

Seleccione las siguientes opciones en el asistente: - Microsoft Visual Studio 2010 - Sí, crear un elemento de menú 'Herramientas' - carga cuando se inicia la aplicación - Mi complemento no tolerará la interfaz de usuario modal, y se puede usar con compilaciones de línea de comando.

2) Añadir referencias a Microsoft.Build y Microsoft.Build.Framework

3) Encuentra la implementación de Exec en los Connect.cs archivo

4) Reemplazar con este código:

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) Una mejor destino personalizada durante la depuración, ya que el que los errores anteriores:

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

6) El código anterior no tiene ningún error para verificar la brevedad, querrá ser mucho más limpio, ya que se ejecutará en el IDE. El complemento colocará un elemento de menú en el menú Herramientas. Como se describió anteriormente, simplemente busca el proyecto que contiene el documento del editor actualmente activo, que necesitaría una mejor fontanería para lo que esté cocinando.

Esta técnica obtiene la instancia del motor de compilación dentro del IDE y hace que ejecute una compilación en una instancia separada del proyecto.

2

No tiene que codificar con el Exec, aunque esa es una forma de hacerlo.La manera más fácil es hacer lo siguiente:

En el atributo DefaultTargets="Build" a una costumbre de destino que crea, dicen "All" así:

DefaultTargets="All" 

A continuación, en su aduana "Todos" de destino, puede utilizar los DependsOnTargets atribuir, como la siguiente:

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

Esto entonces construir y poner fuera de archivos zip en su objetivo de encargo "All".

3

Si está ejecutando la compilación dentro de Visual Studio, habrá una variable de compilación de VisualStudioDir durante la compilación.

Para ejecutar sólo es un VS construir sesión de hacer esto:

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

Para ejecutar sólo en una construcción fuera de VS hacer esto:

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

Usted tendrá que incluir el archivo de destino personalizado en una de dos maneras.

  1. Conjunto CustomBeforeMicrosoftCommonTargets la variable de entorno
  2. Editar el archivo del proyecto para incluir el archivo de destino personalizado mediante la adición de una importación

    <Imports Project="CustomBuildTasks.Targets"><Imports/> 
    
Cuestiones relacionadas