Cevabı burada buldum:
http://www.digitallycreated.net/Blog/59/locally-publishing-a-vs2010-asp.net-web-application-using-msbuild
Visual Studio 2010, web uygulaması projenizi tek bir düğmeyle kolayca yayınlamanıza olanak tanıyan harika yeni Web Uygulaması Projesi yayınlama özelliklerine sahiptir. Web.config dönüşümü ve paket oluşturma perde arkasında proje dosyanıza aktarılan devasa bir MSBuild komut dosyası tarafından yapılır (şu konumda bulunur: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft .Web.Publishing.targets). Ne yazık ki, komut dosyası oldukça karmaşık, dağınık ve belgelenmemiş (diğerlerinde dosyada çoğu zaman kötü yazılmış ve çoğunlukla işe yaramaz yorumlar). Bu dosyanın büyük bir akış şeması ve ona nasıl bağlanılacağına dair bazı belgeler güzel olurdu, ancak ne yazık ki eksik görünüyor (ya da en azından bulamıyorum).
Maalesef bu, komut satırı üzerinden yayın yapmanın olması gerekenden çok daha opak olduğu anlamına geliyor. Bu alandaki dokümantasyon eksikliğine şaşırdım, çünkü bugünlerde birçok mağaza sürekli bir entegrasyon sunucusu kullanıyor ve hatta bazıları otomatik dağıtım (VS2010 yayınlama özelliklerinin çok yardımcı olabileceği) yapıyor, bu yüzden bunu etkinleştirmeyi düşünürdüm ( kolayca!) özellik için oldukça temel bir gereklilik olurdu.
Her neyse, Microsoft.Web.Publishing.targets dosyasını saatlerce kazdıktan ve kafamı deneme yanılma duvarına vurduktan sonra, Visual Studio'nun sihirli bir tıklama ile "Dosya Sistemine Yayınla" yı nasıl gerçekleştirdiğini anlamayı başardım. ve "Dağıtım Paketi Oluştur" özellikleri. Biraz MSBuild komut dosyası yazacağım, bu yüzden MSBuild'e aşina değilseniz, bu hızlandırılmış kurs MSDN sayfasına göz atmanızı öneririm.
Dosya Sistemine Yayınla
VS2010 Dosyaya Yayınlama Sistemine Yayınlama İletişim Kutusunu Dosya Sistemine Yayımlama biraz zaman aldı çünkü MSBuild'in bazı mantıklı kullanımlarının gerçekleşmesini bekledim. Bunun yerine, VS2010 oldukça tuhaf bir şey yapıyor: MSBuild'i projenizin obj klasöründeki web uygulamasının dosyalarını hazırlayan bir tür yarı dağıtım gerçekleştirmeye çağırıyor, ardından bu dosyaların manuel bir kopyasını yapıyor gibi görünüyor (yani MSBuild dışında) hedef yayın klasörünüze. Bu gerçekten çılgınca bir davranıştır çünkü MSBuild dosyaları (ve diğer yapı ile ilgili şeyleri) kopyalamak için tasarlanmıştır, bu nedenle tüm sürecin VS2010'un çağırdığı bir MSBuild hedefi, bir hedef değil, manuel bir kopya olması mantıklı olacaktır.
Bu, bunu komut satırında MSBuild aracılığıyla yapmanın, proje dosyanızı belirli bir hedefle çağırmak ve bazı özellikleri ayarlamak kadar basit olmadığı anlamına gelir. VS2010'un yapması gerekeni yapmanız gerekecek: kendiniz yarı dağıtımı gerçekleştiren bir hedef oluşturun ve ardından sonuçları hedef klasöre kopyalayın. Proje dosyanızı düzenlemek için VS2010'da projeye sağ tıklayın ve Projeyi Kaldır'a tıklayın, ardından tekrar sağ tıklayıp Düzenle'ye tıklayın. Web uygulaması hedeflerini içe aktaran İçe Aktar öğesini bulana kadar aşağı kaydırın (Microsoft.WebApplication.targets; bu dosyanın kendisi daha önce bahsedilen Microsoft.Web.Publishing.targets dosyasını içe aktarır). Bu satırın altına, PublishToFileSystem adlı yeni hedefimizi ekleyeceğiz:
<Target Name="PublishToFileSystem"
DependsOnTargets="PipelinePreDeployCopyAllFilesToOneFolder">
<Error Condition="'$(PublishDestination)'==''"
Text="The PublishDestination property must be set to the intended publishing destination." />
<MakeDir Condition="!Exists($(PublishDestination))"
Directories="$(PublishDestination)" />
<ItemGroup>
<PublishFiles Include="$(_PackageTempDir)\**\*.*" />
</ItemGroup>
<Copy SourceFiles="@(PublishFiles)"
DestinationFiles="@(PublishFiles->'$(PublishDestination)\%(RecursiveDir)%(Filename)%(Extension)')"
SkipUnchangedFiles="True" />
</Target>
Bu hedef, VS2010'un manuel kopyasını yapmadan önce çağırdığı PipelinePreDeployCopyAllFilesToOneFolder hedefine bağlıdır. Microsoft.Web.Publishing.targets'da bazı araştırmalar, bu hedefin çağrılmasının proje dosyalarının _PackageTempDir özelliği tarafından belirtilen dizine yerleştirilmesine neden olduğunu gösterir.
Hedefimizde çağırdığımız ilk görev, üzerine görevin yalnızca PublishDestination özelliği ayarlanmadıysa gerçekleşmesini sağlayan bir koşul yerleştirdiğimiz Hata görevidir. Bu sizi yakalayacak ve PublishDestination özelliğini belirtmeyi unutmanız durumunda derlemede hata yapacaktır. Daha sonra, zaten mevcut değilse, bu PublishDestination dizinini oluşturmak için MakeDir görevini çağırıyoruz.
Ardından, _PackageTempDir klasörü altında bulunan tüm dosyaları temsil eden PublishFiles adlı bir Öğe tanımlarız. Ardından, tüm bu dosyaları Yayınlama Hedefi klasörüne kopyalayan Kopyalama görevi çağrılır. Copy öğesindeki DestinationFiles özniteliği biraz karmaşıktır; öğelerin bir dönüşümünü gerçekleştirir ve yollarını PublishDestination klasöründe köklenen yeni yollara dönüştürür (bu% () s'nin ne anlama geldiğini görmek için Bilinen Öğe Meta Verilerine bakın).
Bu hedefi komut satırından çağırmak için artık bu komutu basitçe uygulayabiliriz (açıkça proje dosyası adını ve özelliklerini size uyacak şekilde değiştiririz):
msbuild Website.csproj "/p:Platform=AnyCPU;Configuration=Release;PublishDestination=F:\Temp\Publish" /t:PublishToFileSystem
Condition="false"
Geriye dönük uyumluluk için koşullu içe aktarma var. VS2010, yanlış koşul nedeniyle atlansa bile bu içe aktarmanın var olmasını gerektirir. Tekrar bakarsanız, csproj'un$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets
geçerli Visual Studio sürümü için hedefler dosyasına çözümlenen başka bir içe aktarım içerdiğini görürsünüz .