2011-02-26 25 views

cevap

37

Özel bir harici araç kullanarak basit bir yöntem (tüm bu tatmin edici olmayan şeyler) vardır. | Araçlar '

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

Git: Proje dosyasını ele alalım

aşağıdaki modifikasyona sahiptir Harici Araçlar ve bunun gibi bir tane ekleyin:

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 

bu çıktıyı üretir Running olarak:

Build FAILED. 

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

Ne harici araç olarak MSBuild seslenerek ve doğrudan hedefe koşmak yaşıyor yapıyoruz. MSBuild'in tam yolunu sağlamanız gerekir; çünkü IDE, oluşturduğu oluşturma ortamının kullanılabilir olduğu aynı özellikleri korumaz.

Bu komutu, hangi komutun ayarlandığını öğrenerek bir kısayoluna bağlayabilirsiniz: Tools.ExternalCommand # kümesinde.

Daha fazla karmaşıklığa sahip bir çözüm arıyorsanız, biraz daha ilgili. Burada kısaca (VS2010 için):

1) Bir VS Eklentisi oluşturun (Dosya | Yeni | Proje | Diğer Proje Türleri | Genişletilebilirlik | Visual Studio Eklentisi). Bunu almak için VS SDK'nın yüklü olması gerekip gerekmediğinden emin değilim, bu uzantı yöneticisinde kullanılabilir.

sihirbazın aşağıdaki seçenekleri belirleyin: - Microsoft Visual Studio 2010 - Uygulama başladığında Load - - Evet, bir 'Araçlar' menü öğesi oluşturmak My eklenti kalıcı bir UI koymak asla ve komut satırı ile kullanılabilir.

2)) Connect.cs içinde Exec uygulanması

4 dosya Bul) Microsoft.Build ve

3 Microsoft.Build.Framework

başvurular ekle bu kod ile değiştirin:

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) ayıklama sırasında daha iyi bir özel hedef, çünkü daha önceki bir hata:

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

6) Yukarıdaki kod, kısırlık kontrolü için bir hata içermiyor, IDE'de çalışacağından çok daha temiz olmasını istersiniz. Eklenti, Araçlar menüsünüze bir menü öğesi yerleştirecektir. Yukarıda yazıldığı gibi, şu anda aktif olan editör dökümanını içeren projeyi araştırıyorsunuz.

Bu teknik, yapı altyapısı örneğini IDE içinden alır ve projenin ayrı bir örneğinde bir yapı yürütmesini sağlar.

2

Bunu yapmanın bir yolu olsa da, Exec ile kod yazmanıza gerek yoktur.

alanındaki özel bir DefaultTargets="Build" ayrıntının oluşturmak Hedef Değişim, şöyle "All" ki::

DefaultTargets="All" 

Ardından aramaları özel "Hepsi" hedef, sen DependsOnTargets kullanabilirsiniz kolay bir yolu aşağıdaki yapmaktır sonra inşa edecek

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

Bu ve dışarı özel "All" hedef zip dosyaları koyun: aşağıdaki gibi bağlıyor.

3

Visual Studio'nun içindeki bir yapıyı çalıştırıyorsanız, yapı sırasında VisualStudioDir yapı değişkeni olacaktır. oturumu bir VS inşa yalnızca yürütmek için

bunu:

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

sadece dışında VS bir yapı içinde yürütmek için bunu:

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

Sen özel hedefleri dosyasını eklenmesi gerekmektedir iki yoldan birinde.

  1. Set ortam değişkeni CustomBeforeMicrosoftCommonTargets
  2. Düzenleme Bir içe

    <Imports Project="CustomBuildTasks.Targets"><Imports/> 
    
ekleyerek özel hedefler dosya eklemek için dosyayı proje