msbuild kullanarak bir çözümün proje dosyasını belirtin


116

Devenv.com ile yaptığımız gibi msbuild kullanarak belirli bir çözüm projesi oluşturmak için komut satırı istiyorum. Devenv.com'da aşağıdaki komut satırını kullanarak bir çözüm projesi belirleyebiliriz

devenv.com /Build Release|x86 test.sln /project "testproject"

Yukarıdaki komut satırını kullanarak, devenv.com'u kullanarak test.sln'de test projesini oluşturabilirim. Msbuild için aynı çözüm için komut satırı nedir.

Teşekkürler


Test projesinin kendisini msbuild'e iletmemenizin bir nedeni var mı?
Mark Smith

2
Yorumumu artık düzenleyemediğim için. Demek istediğim çözüm yerine doğrudan projeye atıfta bulunmaktır. "msbuild testproject / p: Configuration = Release / p: Platform = x86"
Mark Smith

farklı zamanlarda farklı projeler inşa etmem gerekiyor. devenv.com'u kullanarak bu çözümün projesini belirterek bu çok kolay
tjdoubts

Sahip olduğunuz tek sorun buysa, gerekli projeleri doğru zamanlarda oluşturmak için msbuild'i kullanabilmelisiniz. Zaten çözümde farklı zamanlarda yürüttüğünüz farklı komutlarınız var, öyleyse neden farklı msbuild komutlarıyla uygun zamanlarda projelere başvurmuyorsunuz? Projeleriniz doğru bir şekilde kurulmuşsa, sln dosyasını kullanmadan tüm referanslarını çözmeleri gerekir.
Mark Smith

Yanıtlar:


202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Çözümdeki /tproje adı atananın proje dosya adından farklı olabileceğine dikkat edin.

Ayrıca, Nasıl Yapılır: MSBuild.exe kullanarak çözümlerde belirli hedefler oluşturma konusunda belirtildiği gibi :

Proje adı karakterlerden herhangi içeriyorsa %, $, @, ;, ., (, ), veya ', bir bunların yerine _belirtilen hedef adına.

Ayrıca aynı anda birden fazla proje oluşturabilirsiniz:

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

Yeniden inşa etmek veya temizlemek /t:projectiçin /t:project:cleanveya olarak değiştirin/t:project:rebuild


99
Önemli bir not: projenizde bir '.' Varsa
Adında

4
Benim Msbuild tekrarlamak için birden fazla proje inşa için @easton, synthax oldu /tsürüme her proje için parametreyi:msbuild test.sln /t:project /t:project2
Philippe

46
Ayrıca, bir çözüm klasörü kullanıyorsanız, proje adının önüne klasör adı ve bölü çizgisi eklemeniz gerekir. Yukarıda bahsedilen @Watusimoto gibi, adınızda nokta (.) Varsa, bunları alt çizgilerle (_) değiştirmeniz gerekir. Böyle bir şey ile sona erdi: /t:SlnFolder\My_Project_name.
Travis Parks

28
@TravisParks: Ayrıca olmadığını "çözüm klasörü" kayda değer olabilir değil , bir sistem dosyası değil, Solution Explorer görünümünde bir klasöre bakın.
joshbodily

4
Ayrıca klasör adındaki '(' ve ')' yi '_' ile değiştirmek zorunda kaldım (GYP tarafından oluşturulan projeler). Sanırım tüm özel karakterler alt çizgi ile değiştirildi.
Maxime Viargues

15

MSBuild aslında çözüm değil, projelerin kullanımıyla çalışır. Çözüm, yalnızca MSBuild'de dahili olarak geçici bir proje dosyasına ayrıştırmak için kullanılır. Aşağıdaki komutu çalıştırarak ilgilendiğiniz projeyi doğrudan MSBuild aracılığıyla oluşturabilmelisiniz.

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

Çözüm yerine doğrudan projeyi kullanarak karşılaşabileceğinizi bildiğim önemli bir sorun var: Projeye referanslar eklemek ve derleme sisteminin bağımlılıkları otomatik olarak yapmasına izin vermek yerine, çözümü projeler arasındaki bağımlılıkları ifade etmek için kullanırsanız .

Sln dosyasını kullanarak bir derleme sırasını uyguluyorsanız, bu bağımlılıkları doğrudan proj dosyalarında çalıştırmanızı ve sln'den kaldırmanızı öneririm. Bu, herhangi bir proje dosyasını doğrudan MSBuild'den çağırmanıza izin verir ve projeler, herhangi bir ek çalışma olmadan bağımsız olarak oluşturulur. Visual Studio'da çalışmayı bir derleme girdisi olarak değil, daha kolay hale getirmek için sln dosyasını gerçekten bir proje grubu olarak değerlendirmelisiniz.


4
Lütfen derleme sırasının proje dosyalarından nasıl uygulanabileceğine işaret edin. Teşekkürler.
ProgramCpp

4
İşte proje adını doğrudan kullanmanın başka bir sorunu. Örneğin çözümünüzde 5 proje var. Bazı projelerde DebugPro yapılandırması vardır ve diğer projeler buna sahip değildir. Tüm projelerin sahip olduğu her şeyin dosya olduğu, ancak yalnızca çözüm dosyasının yapılandırıldığı bir proje oluşturursanız, çözüm yapılandırmasını DebugPro seçtiyseniz, her proje için hangi proje yapılandırmasının kullanılacağını bilirseniz.
Alex

@ProgramCpp Bir projeden diğerine referanslar eklediğinizde, başvurulan projenin önce oluşturulması gerektiğini otomatik olarak anlar.
jpaugh

Bu yaklaşımın diğer bir dezavantajı, projedeki göreceli yolun çözüm dosyasına göre çözümlenmesidir. Doğrudan proje oluşturduğunuzda göreceli yol değişecektir. Çıktı başka bir yerde olabilir ve birim testleri yanlış dizinleri arayabilir.
Tomas Kubes

Proje yapılandırmasında $ (SolutionDir)
Alex Che

8

Gelecek arayanlara bilgi olarak gönderme

Aşağıdakileri derleme betiğine ekleyin ve bir kez çalıştırın. Bu, msbuild'in gerçekten kullanacağı kesin hedefleri ve diğer bilgileri üretecektir.

Örn: Eğer varsa .proje adı veya klasörlerde Msbuild bekliyoruz _yerine ..

set MSBuildEmitSolution=1

Bilgileri aldıktan sonra, derleme komut dosyasını gerekli ayrıntılarla güncelleyin.


6
`` Varsa '.' proje adı veya klasörlerinde msbuild "." yerine "_" bekler. "
dhcgn

2

Bunu yapmak için, projenin hedef adını değil, projenin hedef adını bilmeniz gerekir .

Bunu bulmanın bir yolu MSBuildEmitSolution, değerine çağrılan özel bir ortam değişkeni ayarladıktan sonra MSBuild'i SLN'nize karşı amaçlanan parametrelerle kullanmaktır 1.

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

Son zamanlarda bunu, iç içe geçmiş dizinlerdeki bir hedef için çok özel bir ad nedeniyle yapmak zorunda kaldım. Oluşturduğum dosyadan my_stuff.sln.metaprojşu satırı buldum:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

Bu, kullanılacak komut satırının,

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64

2
İhtiyacım olan buydu. Bunu çalıştırmak istemiyorsanız ipucu: hedefiniz proje dosyanızın mevcut yolundan klasör yapısı eksi proje dosya uzantısıdır ( .csprojbenim durumumda). Ben <3 SO!
İade Yok İade Yok

1

Sadece ek bilgi eklemek için, proje klasöründeki msbuild'i çalıştırmak varsayılan olarak proje dosyasını oluşturacaktır çünkü oradaki tek dosya.

>msbuild

Msbuild'i bu şekilde kullanmanın birçok çeşidi vardır. Proj dosyasını doğrudan belirtebilirsiniz.

>msbuild helloworld.csproj -t:Build.

Kullanım, proje dosyası gereksinimleri ve çözüm yerine projeyi oluşturmanın avantajları için msbuild belgelerini inceleyin.

MS MSBuild Belgeleri

Yukarıda mark-smith tarafından belirtildiği gibi bu şekilde inşa etmenin faydaları vardır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.