Visual Studio Post Build Etkinliği - Göreli Dizin Konumuna Kopyala


228

Başarılı bir derlemede, çıktı dizininin içeriğini aynı "temel" klasör altındaki farklı bir konuma kopyalamak istiyorum . Bu üst klasör göreceli bir bölümdür ve Kaynak Kontrol ayarlarına bağlı olarak değişebilir.

Kullanabileceğim birkaç Makro değerini listeledim ...

$ (SolutionDir) = D: \ GlobalDir \ Sürüm \ AppName \ Solution1 \ build

$ (ProjectDir) = D: \ GlobalDir \ Sürüm \ UygulamaAdı \ Çözüm1 \ Sürüm \ ProjectA \

Output Dir içeriğini aşağıdaki klasöre kopyalamak istiyorum:

D: \ GlobalDir \ Sürüm \ UygulamaAdı \ Çözüm2 \ Proje \ Bağımlılık

"D: \ GlobalDir \ Version \ AppName" taban konumunun yukarıdaki makrolardan birinden getirilmesi gerekir. Ancak, makro değerlerinin hiçbiri yalnızca üst konumu listelemez .

Post-build copy komutu için yalnızca temel konumu nasıl ayıklayabilirim ?

Yanıtlar:



293

Projenin Derleme Sonrası olay komut satırına koymak istedikleriniz:

copy /Y "$(TargetDir)$(ProjectName).dll" "$(SolutionDir)lib\$(ProjectName).dll"

DÜZENLE: Veya hedef adınız Proje Adından farklıysa.

copy /Y "$(TargetDir)$(TargetName).dll" "$(SolutionDir)lib\$(TargetName).dll"

1
İyi bahşiş. Alıntıları unuttum.
Matt Montag

3
Benim için işe yaramadı çünkü unuttum /Y. Komutun tamamını gösterdiğiniz için teşekkürler.
Mark

10
Bir kullanabilir xcopygibi, kaynak klasörün (ağacı) yapısını muhafaza ederken, benzer bir sonuç elde etmek için Joker karakterler ve uygun anahtarlarla:xcopy /i /e /s /y /f "<source>\MyFolder\*" "<destination>\MyFolder"
Dr1Ku

4
Kaynak kısmında $ (ProjectName) yerine $ (TargetName) kullanmanızı öneririm.
Alexander Schmidt

2
güncellememi önceki comment:, copy /Y "$(TargetPath)" "$(SolutionDir)somewhere\"fazladan ters eğik çizgi olmadan, $ (SolutionDir) sondaki bir ters eğik çizgi içerdiğinden (en azından VS2012'de)
buzlu


10

Bu ilgili olduğunu düşünüyorum, ama msbuildVS içinde bina vs doğrudan komut satırı (bir toplu iş dosyasından) kullanarak bina bir sorun vardı .

Aşağıdaki gibi bir şey kullanmak:

<PostBuildEvent>
  MOVE /Y "$(TargetDir)something.file1" "$(ProjectDir)something.file1"
  start XCOPY /Y /R "$(SolutionDir)SomeConsoleApp\bin\$(ConfigurationName)\*" "$(ProjectDir)App_Data\Consoles\SomeConsoleApp\"
</PostBuildEvent>

(not: start XCOPYyerine XCOPYkopyalama engelleyen bir izin sorununu etrafında almak için kullanılır)

Makro , bir toplu iş dosyasından msbuild yürütülürken $(SolutionDir)değerlendirildi ..\, bu da XCOPYkomutun başarısız olmasına neden oldu . Aksi takdirde Visual Studio içinden inşa iyi çalıştı. /verbosity:diagnosticDeğerlendirilen çıktıyı görmek için ile onaylandı .

$(ProjectDir)..\Bunun yerine, aynı şey olan makroyu kullanmak iyi çalıştı ve her iki oluşturma senaryosunda da tam yolu korudu.


1
kredi vermeyi unuttuğumda aynı hack çapraz bağlantı ...
drzaus

Startbenim için çalıştı (için xcopypaylaşılan bir klasörde).
AgentFire

4

Doğrudan msbuild'i kullanmak mantıklı olmaz mı? Bunu her derlemeyle yapıyorsanız, sonunda bir msbuild görevi ekleyebilirsiniz? Visual Studio IDE'de gösterilmeyen başka bir makro değeri bulamıyorsanız görmek istiyorsanız, msbuild seçeneklerini tanılamaya açabilirsiniz ve bu, kullanabileceğiniz tüm değişkenleri gösterecektir. mevcut değerlerinin yanı sıra.

Bunu görsel stüdyoda açmak için Araçlar / Seçenekler'e gidin, ardından ağaç görünümünü Projeler ve Çözümler adlı bölüme kaydırın, bunu genişletin ve Oluştur ve Çalıştır'ı tıklayın, sağda derleme çıktı ayrıntı düzeyini belirten bir açılır menü , bunu teşhis olarak ayarladığınızda, başka hangi makro değerlerini kullanabileceğinizi gösterir.

Hangi seviyeye gitmek istediğinizi ve yapınızın ne kadar karmaşık olmasını istediğinizi tam olarak bilmediğimden, bu size biraz fikir verebilir. Son zamanlarda bile yapının bir parçası olarak SQL kodu yürütmek, yapı komut dosyaları yapıyor. Biraz daha fazla yardım veya hatta bazı örnek derleme komut dosyaları istiyorsanız, bana bildirin, ancak derlemenin sonunda çalıştırmak istediğiniz küçük bir işlemse, belki de tam msbuild betiğine gitmek biraz fazla öldürmektir. .

Umarım Rihan'a yardım eder


thx Rihan, ama görünüşe göre VS 2003 bunu desteklemiyor gibi görünüyor! Tabii ki post build etkinliği ;-) ile oldukça
memnunum

Ben vs2003 olduğunu fark etmedi ve bu nedenle msbuild olası bir çözüm olarak kullanarak, vs2003 msbuild dönemi öncesi olduğunu hatırlıyorum? Yanıt için teşekkürler. VS 2003 ile iyi şanslar,
VS2005'e
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.