2010-09-03 4 views
6

Çözümümdeki diğer projelerden referanslar içeren bir WiX (Windows Installer XML) v3 projem var. Daha sonra benim Heat kullanmak için referans projelerinin bazı çıktılarını toplamak için WiX projesinin BeforeBuild olayında kopya görevi kullanıyorum.Visual Studio ve MSBuild yangın Bir WiX projesinde farklı olarak BeforeBuild

Visual Studio'nun içinde WiX projesini (çözümü değil) oluşturduğumda, başvurulan projelerin her biri WiX projemden önce oluşturulur ve bir kez oluşturulduktan sonra, WiX projemdeki BeforeBuild olayı ve ardından WiX projesinin kendisi inşa edildi. Beklediğim davranış budur - WiX BeforeBuild'deki referans projelerinin bin dizinlerinden dosyalara erişebilir ve bunları, WiX projesi Candle'u yürütmeden önce kullandığım gibi kullanabilirim.

Yapmakta olduğum sorun, Wi-Fi dosyasını MSBuild aracılığıyla oluşturduğumda, BeforeBuild olayının, başvurulan projelerin ÖNCESİNDEN ÖNCE hemen ateş ettiğini bulmuyorum. Davranıştaki bu farklılık, komut satırından oluştururken başvurulan projelerin çıktılarını kullanamayacağı anlamına gelir.

Neden Visual Studio'nun içine komut satırında MSBuild ile çalıştırıldığında, BeforeBuild farklı bir zamanda yürütme neden oluyor?

cevap

8

Visual Studio'nun içinde çalışıyorsanız, hangi projelerin yapılması gerektiğini belirlemek için çözüm bağımlılıkları (açık veya proje referanslarına dayanarak) kullanılır ve her biri için ayrı bir oluşturma başlatılır. Bu, çözümlerin MSBuild kullanılarak oluşturulmamış projeleri de içerebileceğinden ve diğer projelerin kendileri için çözümde belirlenen açık bağımlılıkları olduğu için bu gereklidir. Yan etki, her projenin tek başına bir yapı olarak ele alınmasıdır, bu nedenle sizin için doğru BeforeBuild sağlama.

MSBuild kullanarak komut satırından oluşturuyorsanız, bağımlılık projeleri çözümlenir (ve gerekli) ResolveReferences hedefi sırasında. BeforeBuild hedefi ve PreBuild olayının (PreBuildEvent hedefinden gerçekleştirilir) her ikisi de ResolveReferences hedefinden önce gerçekleştirilir. Böylece bağımlı proje için başlatılmadan önce bağımlı proje BeforeBuild hedef biter.

Tek bir projenin bakış açısıyla, bağımlılık çözümünün kendisinin BeforeBuild hedef çıkışına bağlı olabileceğinden, bağımlılıkların çözümünden önce BeforeBuild hedefinin uygulanmasının mantıklı olduğunu unutmayın. Örneğin, BeforeBuild, SCM'dan bağımlılık projelerinin en son kopyasını almak için özel bir komut dosyası yürütebilir.

+1

Teşekkürler Franci. BeforeBuild gibi şeyler ihtiyacım olan şey değil. ResolveReferences hedefinin tüm başvurulan projeleri oluşturmasından sonra ateşlenecek WIX projemde geçersiz kıldığım bir olay var mı? –

+2

@DavEvans, AfterTracgets veya AfterTargets özniteliği aracılığıyla AfterResolveReferences hedefine bakın. Alternatif olarak, BeforeTargets özniteliği ile derleme hedef: ' ' – dirtybird