Derlemeyle ilgili komutlar için çözüm düzeyi --output
seçeneği artık geçerli değil
7.0.200 SDK'sında, aşağıdaki komutlarla bir çözüm dosyası kullanılırken seçeneği artık kabul/--output
-o
etmemeye ilişkin bir değişiklik yapıldı:
build
clean
pack
publish
store
test
vstest
Bunun nedeni, seçeneği tarafından denetlenen özelliğin OutputPath
semantiğinin --output
/-o
çözümler için iyi tanımlanmamış olmasıdır. Bu şekilde oluşturulan projelerin çıktıları, tutarsız olan ve kullanıcı tarafından bildirilen bir dizi soruna yol açan aynı dizine yerleştirilir.
Bu değişiklik, 7.0.201 SDK'sında uyarı önem düzeyine düşürüldü ve pack
etkilenen komutlar listesinden kaldırıldı.
Sürüm kullanıma sunulmuştur
.NET 7.0.200 SDK'sı, yalnızca 7.0.201 SDK'sında uyarıya indirildi.
Önceki davranış
Daha önce, bir çözüm dosyası kullanırken belirttiyseniz --output
/-o
, tüm oluşturulan projelerin çıktısı belirtilen dizine tanımsız ve tutarsız bir sırada yerleştirilirdi.
Yeni davranış
Seçenek dotnet
bir çözüm dosyasıyla kullanıldığında CLI hata --output
/-o
döndürür. 7.0.201 SDK'dan başlayarak, bunun yerine bir uyarı gönderilir ve uyarı veya hata oluşturulmaz.dotnet pack
Hataya neden olan değişikliğin türü
Bu hataya neden olan değişiklik, betikler ve sürekli tümleştirme işlem hatları oluşturmak için değişiklik yapılmasını gerektirebilir. Sonuç olarak hem ikili hem de kaynak uyumluluğunu etkiler.
Değişiklik nedeni
Seçeneği tarafından --output
/-o
denetlenen özelliğin OutputPath
semantiği çözümler için iyi tanımlanmadığından bu değişiklik yapıldı. Bu şekilde oluşturulan projelerin çıktıları, tutarsız olan ve kullanıcı tarafından bildirilen bir dizi soruna yol açan aynı dizine yerleştirilir.
Seçeneğiyle --output
bir çözüm oluşturulduğunda, OutputPath
özelliği tüm projeler için aynı değere ayarlanır ve bu da tüm projelerin çıkışlarının aynı dizine yerleştirileceği anlamına gelir. Çözümdeki projelerin karmaşıklık düzeyine bağlı olarak farklı ve tutarsız sonuçlar ortaya çıkabilir. Şimdi farklı çözüm şekillerinin bazı örneklerine ve bunların paylaşılan OutputPath
bir uygulamasından nasıl etkilendiğine göz atalım.
Tek proje, tek TargetFramework
Tek bir , hedefleyen tek bir proje içeren bir TargetFramework
net7.0
çözüm düşünün. Bu durumda, seçeneğin --output
sağlanması proje dosyasındaki özelliğin ayarlanmasıyla OutputPath
eşdeğerdir. Derleme sırasında (veya diğer komutlarda ancak şimdilik oluşturulacak tartışmanın kapsamına girelim), projenin tüm çıkışları belirtilen dizine yerleştirilir.
Tek proje, birden çok TargetFrameworks
Şimdi birden çok TargetFrameworks
ve net6.0
net7.0
içeren tek bir proje içeren bir çözüm düşünün. Çoklu hedefleme nedeniyle, proje her TargetFramework
biri için bir kez olmak üzere iki kez derlenir. Bu 'iç' derlemelerinin OutputPath
her biri için , aynı değere ayarlanır ve böylece iç derlemelerin her biri için çıkışlar aynı dizine yerleştirilir. Bu, en son tamamlanan derlemenin diğer derlemenin çıktılarının üzerine yazılacağı ve MSBuild gibi paralel bir derleme sisteminde varsayılan olarak 'last' değerinin belirsiz olduğu anlamına gelir.
Kitaplık => Konsol => Test, tek TargetFramework
Şimdi kitaplık projesi, kitaplık projesine başvuran bir konsol projesi ve konsol projesine başvuran bir test projesi içeren bir çözüm düşünün. Bu projelerin tümü tek TargetFramework
bir hedefle, net7.0
. Bu durumda, önce kitaplık projesi, ardından konsol projesi derlenir. Test projesi en son oluşturulacak ve konsol projesine başvuracaktır. Oluşturulan her proje için, her derlemenin çıkışları tarafından OutputPath
belirtilen dizine kopyalanır ve böylece son dizin üç projenin de varlıklarını içerir. Bu, test için çalışır, ancak yayımlama için test varlıklarının üretime gönderilmesine neden olabilir.
Kitaplık => Konsol => Test, birden çok TargetFrameworks
Şimdi aynı proje zincirini alın ve derlemeye ek olarak bu projelere net7.0
bir net6.0
TargetFramework
derleme ekleyin. Tek projeli, çok hedefli derlemeyle aynı sorun oluşur- TFM'ye özgü varlıkların belirtilen dizine tutarsız bir şekilde kopyalanması.
Birden çok uygulama
Şimdiye kadar doğrusal bağımlılık grafiğine sahip senaryolara bakıyorduk ancak birçok çözüm birden çok ilgili uygulama içerebilir. Bu, aynı çıkış klasörüne aynı anda birden çok uygulama derlenebileceği anlamına gelir. Uygulamalar aynı ada sahip bir bağımlılık dosyası içerirse, birden çok proje aynı anda çıkış yolunda bu dosyaya yazmaya çalıştığında derleme zaman zaman başarısız olabilir.
Birden çok uygulama bir dosyanın farklı sürümlerine bağımlıysa, derleme başarılı olsa bile, dosyanın çıkış yoluna kopyalanan sürümü belirleyici olmayabilir. Projeler bir NuGet paketinin farklı sürümlerine bağımlı olduğunda (büyük olasılıkla geçişli olarak) bu durum oluşabilir. Tek bir projede NuGet, bağımlılıklarının (NuGet paketleri ve/veya proje başvuruları aracılığıyla geçişli bağımlılıklar dahil) aynı sürümde birleştirilmesine yardımcı olur. Birleştirme tek bir proje ve bağımlı projeleri bağlamında yapıldığından, iki ayrı üst düzey proje oluşturulduğunda paketin farklı sürümlerini çözümlemenin mümkün olduğu anlamına gelir. Daha yüksek sürüme bağlı olan proje en son bağımlılığı kopyalarsa, genellikle uygulamalar başarıyla çalıştırılır. Ancak, en son alt sürüm kopyalanırsa, daha yüksek sürüme karşı derlenen uygulama çalışma zamanında derlemeyi yükleyemeyecektir. Kopyalanan sürüm belirleyici olmadığından, bu durum sorunu tanılamanın çok zor olduğu düzensiz, güvenilir olmayan derlemelere yol açabilir.
Diğer örnekler
Bu temel hatanın pratikte nasıl ortaya koyuluyor hakkında daha fazla örnek için dotnet/sdk#15607 konusuna bakın.
Önerilen eylem
Genel öneri, daha önce gerçekleştirdiğiniz eylemi seçenek olmadan/ --output
-o
gerçekleştirmek ve ardından komut tamamlandıktan sonra çıkışı istenen konuma taşımaktır. Eylemi belirli bir projede gerçekleştirmek ve daha iyi tanımlanmış semantiklere sahip olduğu için bu seçeneği uygulamaya --output
/-o
devam etmek de mümkündür.
Mevcut davranışı tam olarak korumak istiyorsanız, bir MSBuild özelliğini istenen dizine ayarlamak için bayrağını kullanabilirsiniz --property
. Kullanılacak özellik şu komuta göre değişir:
Command | Özellik | Örnek |
---|---|---|
build |
OutputPath |
dotnet build --property:OutputPath=DESIRED_PATH |
clean |
OutputPath |
dotnet clean --property:OutputPath=DESIRED_PATH |
pack |
PackageOutputPath |
dotnet pack --property:PackageOutputPath=DESIRED_PATH |
publish |
PublishDir |
dotnet publish --property:PublishDir=DESIRED_PATH |
store |
OutputPath |
dotnet store --property:OutputPath=DESIRED_PATH |
test |
TestResultsDirectory |
dotnet test --property:OutputPath=DESIRED_PATH |
NOT En iyi sonuçlar için DESIRED_PATH mutlak bir yol olmalıdır. Göreli yollar, beklemediğiniz yollarla 'sabitlenir' (yani mutlak hale getirilir) ve tüm komutlarla aynı şekilde çalışmayabilir.