2011-02-26 9 views
28

사용자 지정 대상을 csproj 파일에 추가한다고 가정합니다. Visual Studio에서 해당 타겟을 실행할 수 있습니까? 나는 그것을 prebuild 또는 postbuild 단계로 만들고 싶지 않다, 나는 단지 Visual Studio에서이 타겟 (및 의존성)을 실행할 수 있기를 원한다.VisualStudio에서 사용자 지정 msbuild 대상 실행

답변

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에게 전화하고 직접 목표를 실행하는 데하고 있습니다. IDE는 생성 된 빌드 환경과 동일한 속성을 유지하지 않으므로 MSBuild의 전체 경로를 제공해야합니다.

설정 도구 #ExternalCommand #에있는 명령 번호를 파악하여 바로 가기에 연결할 수 있습니다.

더 세련된 솔루션을 찾고 있다면 좀 더 복잡합니다. (VS2010의 경우)

1) VS Addin (파일 | 새 프로젝트 | 기타 프로젝트 유형 | 확장 성 | Visual Studio 추가 기능)을 만듭니다. 이 기능을 사용하려면 VS SDK를 설치해야하는지 잘 모르겠지만 확장 관리자에서 사용할 수 있습니다.

마법사에서 다음 옵션 선택 : - 마이크로 소프트 비주얼 스튜디오 2010 - 응용 프로그램이 을 시작할 때로드 - - 예, '도구'메뉴 항목 을 만들 내 추가 기능은 모달 UI를 두지 않을 것이며, 명령 줄 빌드와 함께 사용할 수 있습니다.

2))을 Connect.cs에서 Exec에서의 구현

4 파일 찾기) Microsoft.Build 및

3 Microsoft.Build.Framework

에 대한 참조를 추가 코드로 교체 :

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>" 

이를 밖으로 사용자 정의 "All" 대상에 zip 파일을 넣어 다음과 같은 속성.

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/> 
    
을 추가하여 사용자 정의 목표 파일을 포함하는 파일을 프로젝트
관련 문제