6

Mağazamızda sürekli entegrasyonun bir parçası olarak ürünün yapılarını otomatikleştirmek için Cruise Control & MSBuild kullanıyoruz.Oluşturma işlemi derleme güçlü isimlerle imzaladığında çalışmak için InternalsVisibleTo alınıyor?

Yapının bir kısmı, derleyicileri güçlü isimler alacak şekilde imzalamaktır. Yerel olarak geliştirdiğimizde proje dosyalarımızda, MSBuild komut dosyası tarafından geçersiz kılındığından, imzalamayı belirtmez.

Bu, InternalsVisibleTo özniteliğini kullanmamı gerektiren birim sınamaları yapmak istediğime karar verene kadar, her şey iyi ve güzel. Ayrıca bu tekniği kullanan birim testleri olan güzel bir açık kaynak kütüphanesi kullanmaya başladım.

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")] 

ve tüm iyi:

Bu

benim makinede, şu ifadeyi kullanmak AssemblyInfo.cs güncelleyebilir, anlamına gelir. inşa makine meclisleri imzalar beri

Ancak aralarda yapı bu kontrol, bu çizgi artık şöyle bakmak güncelleştirilmesi gerekir:

[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, 
      PublicKey="magic key here..)"] 

Ben meclisleri imzalamadım yarım akla sahip ve bir gün ara. Bununla birlikte, "imza meclisleri en iyi uygulamadır" (bu mantrayı 3 kez tekrarlayın) ve eğer bunu yapmaktan herhangi bir fayda elde edersek, onu uzak tutmak istemiyorum.

GAC'ye kurulum yapmıyoruz, özellikle kurcalamayı önemsemiyoruz, kütüphanelerimizi kullanan üçüncü taraflar için endişelenmenize gerek yok, uygulamayı güncellediğimizde tüm dosyalarımızı bir kerede güncelleriz. En tanımlanabilir fayda, destekte bulunan bir kişi, bir derlemenin rasgele bir sürümünü çalışma zamanı klasörüne kopyalayamaz ve bir süredir işler gibi görünebilir.

İmzalama işlemini etkinleştirmek için, yaklaşık 100 proje dosyasını elle değiştirerek ilgili işleri yapabilme özelliğini açmak istemiyorum. Ben de kamu olarak iç olması gereken şeyleri işaretleyerek şeyleri hacklemek istemiyorum, bağlayıcı yönlendirmeleri almak istemiyorum & Birim testlerini kaldırmak istemiyorum.

Güçlü isimlere sahip olmanın tüm faydaları ile güçlü isimlerin olmamasının kolaylığını (varsa) ve bunu yapmak için çok fazla iş yaratmak istemiyorum. Bu sormak için çok mu?

Bu mesaj iyi sorunu ve bir çözüm tarif eder, ama bundan yararlanmak için bir MSBuild komut adam sayılmam:

http://social.msdn.microsoft.com/forums/en-US/msbuild/thread/02df643c-956a-48bd-ac01-4a1016d91032/

bu soruna doğru çözümü nedir?

Herhangi bir girdi ve tartışma noktası açıktır.

cevap

4

Anahtar bilgileri derlemeden önce kaynak dosyalara yayabilirsiniz.

Aşağıdaki örnekte, MSBuild Community Tasks numaralı FileUpdate ve C# AssemblyInfo.cs dosyalarında anahtar bilgisinin yamalanması için bir (çok kaba) normal ifadeler kullanılmıştır.

<ItemGroup> 
    <AssemblyInfoFiles Include="$(MSBuildProjectDirectory)**/AssemblyInfo.cs"/> 
</ItemGroup> 
<FileUpdate 
    Files="@(AssemblyInfoFiles)" 
    Regex='(\[assembly:\s*InternalsVisibleTo\(\"[\w.]*\")(\)\])' 
    ReplacementText='$1, PublicKey="$(StrongNamingPublicKey)"$2' /> 

Ancak, her zaman güçlü-ad işareti geliştirme ve dağıtılan ortamları arasında bir daha fark ortadan kaldırılması için daha temiz bir çözüm olacaktır için projeler değiştirerek düşünüyorum ve kolayca komut dosyası olabilir.

+0

Teşekkürler Thomas, bunu deneyeceğim ve bunu işe aldıktan sonra cevap olarak kabul edeceğim. Her yerde güçlü bir şekilde imzalamak için bazı sorunlar var, çoğunlukla bu değişikliği nasıl yapacağımı bilmiyorum ve bunu elle yapmak istemiyorum. MSBuild'i daha iyi bilen biri tarafından yazılan mevcut oluşturma senaryosumuz, imzalamayı daha iyi yapıyor ve büyük bir değişiklik yapmaktan ziyade biraz değiştireceğim. – Wes

+0

Bunu hiç işe almadım, ama cevap olarak işaretleyeceğim. Çalışamayan şey, AssemblyInfoFiles adlı ItemGroup ... her zaman boş olurdu ... herhangi bir fikir neden? İçerme şekli temel olarak ne yazdığınızdır ... Teşekkürler! – Wes

+1

Yukarıdaki ItemGroup, AssemblyInfo.cs dosyalarının düzeltme ekinin, oluşturma komut dosyasının altındaki bir dizinde bulunduğunu varsayar; joker karakter, geçerli olanın altındaki herhangi bir diziyle eşleşecektir. MSBuild hakkında daha fazla bilgi için sözdizimi [Nasıl Yapılır: Oluşturulacak Dosyaları Seçin] (http://msdn.microsoft.com/en-us/library/ms171454.aspx) bölümüne bakın. –

5

Bir derleyici sembolü tanımlamak için bir geliştirici oluşturmayı imzalamayı devre dışı bırakmak için kullandığınız yapılandırmayı kullanın, örn. DO_NOT_SIGN, o zaman, senin AssemblyInfo.cs yılında, bunu kullanın:

#if DO_NOT_SIGN 
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests")] 
#else 
[assembly: InternalsVisibleTo("MyProject.Tests.UnitTests, PublicKey="magic key here..)"] 
#endif 

benim kişisel görüşüme göre bu yapı komut kaynak kodunu değiştirerek daha şık var.

+0

Cevap skolima için teşekkürler. Bu çözümün benim için sorun olduğunu düşünüyorum, şimdi elimden geldiğince X in dosyalarına elimden gelip, bu yapıyı oluşturmam gerekiyor, ancak ben ya da başkaları yeni projelerde yapmayı hatırlamak zorunda. olası olmayan olayda yer alan anahtar değişti. Herkes tarafından çok iyi anlaşılmayan MSBuild senaryosunda gizlenmiş bir sır değil, herkes tarafından görülebilir ve anlaşılabilir bir yararı var. İçimdeki tembel programcı bence betiklerimizde zaten bir çerçeve olduğu için derleme betiğine gidecektim. – Wes

İlgili konular