Visual Studio kullanırken dosya oluşturma sürümünü otomatik olarak artırabilir miyim?


358

Ben sadece nasıl otomatik olarak Visual Studio (2005) kullanarak dosyalarımı yapı (ve sürüm?) Arttırabilir merak ediyordum .

Söylemenin özelliklerine bakarsam C:\Windows\notepad.exe, Sürüm sekmesi "Dosya sürümü: 5.1.2600.2180" değerini verir. Ben biraz donuk yüz edelim ki benim dll's sürümünde değil, 1.0.0.0 sürümünde bu serin numaraları almak istiyorum.

Birkaç şey denedim, ancak kutudan çıkmış bir işlevsellik gibi görünmüyor ya da belki de yanlış yere bakıyorum (her zamanki gibi).

Özellikle web projeleri ile çalışıyorum ....

İkisine de baktım:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx

ve bir şey yapmanın çok fazla çabanın standart bir uygulama olduğuna inanamadım.

DÜZENLEME: VS2005'te anlayabildiğim kadarıyla çalışmıyor ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx )


1
wild card yalnızca AssemblyVersion için çalışıyor gibi görünüyor ama VS 2005'te AssemblyFileVersion için çalışmıyor
dotnetcoder

VS2005'te C ++ projeleri için çalışan herhangi bir çözüm var mı? Tüm cevaplar .Net ile ilgili gibi görünüyor. İlgili soru . Teşekkürler
Deanna

Net Core projelerinde AssemblyVersion otomatik artışı varsayılan olarak çalışmaz. Csproj'a <Deterministic> False </Deterministic> eklemeniz gerekir. Bkz Visual Studio 2017 (.NET Çekirdek) Otomatik Versioning
Michael Freidgeim

Yanıtlar:


435

Visual Studio 2008'de aşağıdakiler çalışır.

AssemblyInfo.cs dosyasını bulun ve şu 2 satırı bulun:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

Bunu şu şekilde değiştirmeyi deneyebilirsiniz:

[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

Ancak bu size istenen sonucu vermeyecektir, 1.0. * Ürün Sürümü ve 1.0.0.0 Dosya Sürümü ile sonuçlanacaksınız . Ne istiyorsan değil!

Ancak, bu satırların ikincisini kaldırır ve sahipseniz:

[assembly: AssemblyVersion("1.0.*")]

Derleyici, Dosya Sürümü'nü Ürün Sürümü'ne eşit olacak şekilde ayarlayacak ve otomatik olarak artan bir ürün ve senkronize olan dosya sürümünden istediğiniz sonucu alacaksınız. örneğin 1.0.3266.92689


2
Bu, her şey kadar iyi çalışır ve VS2005'te çalışır. Ben 1.0.1.56 gibi bazı rasyonel sayı için umuyordum I 1.0.3266.30135 olsun ama en azından (bazı rasgele sayısına göre olsa: D) artar lieu
inspite

14
ah ben sadece okumak: otomatik (bazı noktadan gün olarak) tarihle son iki sayısında dolduracaktır ve saati (gece yarısından yarım saniye)
inspite

20
Bunu işe almak için AssemblyFileVersion özniteliğini kaldırmak gerek güzel bir çağrı!
David Faivre

76
Bunun eski bir soru olduğunun farkındayım, ancak bu cevaba yolunu bulan başkalarına bu yorumu eklemek istedim. AssemblyVersion'ı artırırsanız, dll'nizi kullanan herhangi bir projenin yeniden derlenmesi gerekir. Ancak, AssemblyVersion aynı tutmak ve AssemblyFileVersion tek başına artırmak, o zaman ne kullanırsa onu yeniden derlemek zorunda kalmadan yeni dll takas edebilirsiniz. Kendinize bunu sorun, bu sadece yeni bir yapı mı, yoksa yeni bir sürüm mü yayınlıyorum?
onefootswis

27
DD59'da 'Yapı' 1 Ocak 2000'den bu yana geçen gün sayısıdır; 'Revizyon' gece yarısından saniyeye 2'ye bölünür (yarım saniye değil, iki saniye aralıklarla). Buraya bakın: stackoverflow.com/a/3387167/11545
Cristian Diaconescu

154

AssemblyInfo.cs dosyasını açın ve değiştirin

// You can specify all the values or you can default the Build and Revision Numbers 
// by using the '*' as shown below:
// [assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

için

[assembly: AssemblyVersion("1.0.*")]
//[assembly: AssemblyFileVersion("1.0.0.0")]

bunu IDE'de proje -> özellikler -> montaj bilgilerine giderek yapabilirsiniz

Ancak bu yalnızca Montaj sürümünü otomatik olarak artırmanıza izin verir ve size

Derleme Dosyası Sürümü: Bu alanda joker karakter ("*") kullanılamaz

Dosya sürüm alanına * yerleştirmeyi denerseniz ileti kutusuna gidin.

Yani assemblyinfo.cs dosyasını açın ve manuel olarak yapın.


D: senin yöntem yeşil kene kazandı ne "bu alanda izin verilmez: "(*)" Evet ben sadece" A joker Meclis Dosya Sürümü" karşılaşıldı
inspite

3
Bu eserler: [assembly: AssemblyVersion ( "1.0. *")] // [montaj: AssemblyFileVersion ( "1.0.0.0")]
inspite

4
Bir salım döngüsü sırasında AssemblyVersion sayısının değiştirilmesi arzu edilmez. Bunun yerine AssemblyFileVersion değiştirilmelidir. Bu konuyla ilgili blog gönderime bakın: philippetruche.wordpress.com/2008/08/12/… Sayıların ne zaman değiştirileceği hakkında Suzanne Cook'un mükemmel yayınına da bakın: blogs.msdn.com/b/suzcook/archive/2003/05/ 29 / 57148.aspx
Philippe

46
* Gününü 65536 olduğunda 4 Haziran 2179'da çalışmayı durduracak şekilde dikkatli olurum
Lloyd Powell


53

Her derleme sürüm numaralarını değiştirmek için başka bir seçenek MSBuild.Community.Tasks Sürüm görevini kullanmaktır . Sadece kurun, kendi kurulumunu indirmek, sonra da aşağıdaki kodu uyarlamak ve sonra yapıştırın sizin de dosyaya:<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />.csproj

<Import Project="$(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.Targets" />
<Target Name="BeforeBuild">
    <Version VersionFile="Properties\version.txt" Major="1" Minor="0" BuildType="Automatic" StartDate="12/31/2009" RevisionType="BuildIncrement">
      <Output TaskParameter="Major" PropertyName="Major" />
      <Output TaskParameter="Minor" PropertyName="Minor" />
      <Output TaskParameter="Build" PropertyName="Build" />
      <Output TaskParameter="Revision" PropertyName="Revision" />
    </Version>
    <AssemblyInfo CodeLanguage="CS"
                  OutputFile="Properties\VersionInfo.cs"
                  AssemblyVersion="$(Major).$(Minor)"
                  AssemblyFileVersion="$(Major).$(Minor).$(Build).$(Revision)" />
</Target>

Not: StartDate özelliğini yerel ayarınıza uyarlayın. Şu anda değişmez kültürü kullanmamaktadır.

14 Ocak 2010'daki üçüncü yapı için bu, VersionInfo.csbu içeriğe sahip bir a oluşturur :

[assembly: AssemblyVersion("1.0")]
[assembly: AssemblyFileVersion("1.0.14.2")]

Bu dosya daha sonra projeye eklenmelidir ( Mevcut öğeyi ekle yoluyla ) ve AssemblyVersionve AssemblyFileVersionsatırlarının kaldırılması gerekir AssemblyInfo.cs.

Sürüm bileşenlerini değiştirmek için farklı algoritmalar $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chmve Sürüm Özellikleri'nde açıklanmaktadır .


2
Bu, FileVersion yapılarının 16 bit tamsayılar kullandığına dair korkunç gerçeği aşmanın en iyi yolu.
Mike Post

1
Paket Konsolu'nu kullanarak VS2012'ye yükleme sorunları yaşadım, bu yüzden github.com/loresoft/msbuildtasks/downloads adresinden indirilen gecelik msi yükleyicilerini kullanmanızı öneririz . Yukarıdan kopyala / yapıştır çalışır. Teşekkürler!
DaveO

Bu yayında reddedildikten ve düzenlendikten sonra: "Bu loresoft.com/projects/msbuildtasks/… adresini de kontrol etmek isteyebilirsiniz , daha önce açıklanan temel işlevleri iyileştirebilir."
radu florescu

1
Bu TFS ile inşa edenler için uygun bir çözüm değildir. Sonuç olarak, bu VersionInfo.cs ve version.txt dosyalarına bekleyen bir düzenleme ekleyecektir. Benim için, her derleme için bekleyen bir düzenleme olması arzu edilmez.
JDennis

@JDennis TFS sürüm ipuçları için buraya bakın ...
Christian

25

Hıristiyanlara benzer bir çözüm buldum, ancak Topluluk MSBuild görevlerine bağlı kalmadan, bu geliştiricileri tüm bu görevleri yüklemek istemediğim için bu benim için bir seçenek değil.

Kod üretiyorum ve bir derleme derliyorum ve sürüm numaralarını otomatik olarak artırmak istiyorum. Ancak, VS 6.0 kullanamıyorum. * AssemblyVersion hile otomatik olarak her gün sayıları arttırır ve daha eski bir yapı numarası kullanan Montajlar ile uyumluluğu bozar. Bunun yerine, sabit kodlu bir AssemblyVersion değil, otomatik olarak artan bir AssemblyFileVersion istiyorum. AssemblyInfo.cs içinde AssemblyVersion belirterek ve MSBuild böyle bir VersionInfo.cs oluşturarak bunu başardım,

  <PropertyGroup>
    <Year>$([System.DateTime]::Now.ToString("yy"))</Year>
    <Month>$([System.DateTime]::Now.ToString("MM"))</Month>
    <Date>$([System.DateTime]::Now.ToString("dd"))</Date>
    <Time>$([System.DateTime]::Now.ToString("HHmm"))</Time>
    <AssemblyFileVersionAttribute>[assembly:System.Reflection.AssemblyFileVersion("$(Year).$(Month).$(Date).$(Time)")]</AssemblyFileVersionAttribute>
  </PropertyGroup>
  <Target Name="BeforeBuild">
    <WriteLinesToFile File="Properties\VersionInfo.cs" Lines="$(AssemblyFileVersionAttribute)" Overwrite="true">
    </WriteLinesToFile>
  </Target>

Bu, AssemblyFileVersion için bir Assembly özniteliğine sahip bir VersionInfo.cs dosyası oluşturur; burada sürüm YY.MM.DD.TTTT'nin derleme tarihi ile birlikte şemasını izler. Bu dosyayı projenize dahil etmeli ve onunla oluşturmalısınız.


MSBuild değişkenleri destekliyor mu? Birine koymak daha iyi olurdu [System.DateTime]::Now, aksi takdirde gece yarısına yakın binalarda eski bir yapı numarasının kullanılmasına neden olabilecek bir yarış durumu vardır.
Edward Brey

Bu dört özelliği DateTime.ToString, gösterim amacıyla tek bir yerde birleştirmek yerine tanımladınız mı , yoksa belirli bir nedeni var mı?
mafu

BeforeBuild etkinliğiniz VS2017'de başlatılmazsa stackoverflow.com/questions/43921992/… 'e bakın
Rhys Jones

Bu çözüm, tüm cevaplara en uygun çözümdür. Ancak sorun, projeyi farklı bir dakika üretmesi gereken ikinci kez oluşturursanız, zaman damgası (veya versioninfo.cs dosyasının içeriği) güncellenmez. Projeyi kapatıp yeniden yüklersem, zaman damgası güncellenir. Bu MSBuild'den bir hata mı? @Boog
Cary


12

Sürüm numaralarını almak için şunu deneyin:

 System.Reflection.Assembly assembly = System.Reflection.Assembly.GetExecutingAssembly();
 System.Reflection.AssemblyName assemblyName = assembly.GetName();
 Version version = assemblyName.Version;

Sürüm numarasını ayarlamak için AssemblyInfo.cs dosyasını oluşturun / düzenleyin

 [assembly: AssemblyVersion("1.0.*")]
 [assembly: AssemblyFileVersion("1.0.*")]

Ayrıca bir yan not olarak, üçüncü sayı 2/1/2000'den bu yana geçen gün sayısıdır ve dördüncü sayı gün içindeki toplam saniye miktarının yarısıdır. Eğer gece yarısı derlerseniz sıfır olmalıdır.


12

Visual Studio (2012, 2013, 2015) 2017 ve 2019'u destekleyen bir görsel stüdyo uzantısı Otomatik Sürümler var.

Ekran görüntüleri resim açıklamasını buraya girin

resim açıklamasını buraya girin


Bu yüzden onu kaldırdım ve daha fazlasını söyleyebilirim ... orijinal csproj dosyasını değiştirir. Bence çok problemli bir uzantı.
Maxim

2
@Maxim En son sürümü deneyin, VS 2017'de çalışmalı
Rady

Mükemmel util. Vs2017'de benim için iyi çalışıyor. Dokümanlar biraz daha net olabilir, ancak yükleyin (site üzerinden) ve ardından MSBuild'i Nuget üzerinden yükleyin, küçük bir projeye başvurun ve oynayın ve oluşturun. Güzel. @ Boog'un cevabı benim için işe yaramadı, ancak tam olarak ne yapmaya çalıştığımı söyledi.
err1

8

AssemblyInfo sürüm numarasına veya diğer yazılarda açıklandığı gibi proje özellikleri altında * ayarlamak Visual Studio / .NET'in tüm sürümleriyle çalışmaz.

Afaik VS 2005'te çalışmadı (VS 2003 ve VS 2008'de). VS 2005 için aşağıdakileri kullanabilirsiniz: Derleme zamanında Otomatik Artış Visual Studio 2005 sürüm oluşturma ve düzeltme numarası .

Ancak, güçlü adlı derlemeler için sürüm numarasının otomatik olarak değiştirilmesinin önerilmediğini unutmayın. Bunun nedeni, güçlü derlemeli derleme başvurularının her zaman belirli bir derleme sürümüne başvuru olması nedeniyle, başvurulan derleme her yeniden oluşturulduğunda böyle bir derleme yapılan tüm başvuruların güncelleştirilmesidir. Microsoft, .NET Framework derlemelerinin sürüm numarasını yalnızca arabirimlerde değişiklik olması durumunda değiştirir. (Not: Hala MSDN'de bunu okuduğum bağlantıyı arıyorum.)


Ben herhangi bir VS sürümü için sadece * Build veya Revizyon kutularına koyabilirsiniz düşünüyorum. Ben sadece VS 2005 kullanarak bunu denedim ve iyi çalışıyor. Bu kod projesi makalesinin yazarının neden bahsettiğinden emin değilim.
MusiGenesis

Belki bir hizmet paketi ile geri döndü, ancak VS 2005'i kullanırken işe yaramadığını hatırlıyorum.
Dirk Vollmar

2005 ile çalışmaz, bir hizmet paketi arayacağım ve rapor vereceğim.
inspite

Belki MusiGenesis otomatik versiyonlamayı sağlayan bir eklentiye sahiptir.
Dirk Vollmar

@divo: hayır, ben fobiyi ekliyorum. Sadece Visual Studio 2005 Professional SP1 kullanıyorum. * İle ilgili bir sorun görmedim, ancak genellikle manuel olarak artırıyorum. Kulağa garip bir böcek gibi geliyor.
MusiGenesis

6

Herhangi bir bağımlılığı bozmamak avantajına sahip olan AssemblyFileVersion özelliğine artan (DateTime) bilgi almak için.


Boog'un çözümüne dayanarak (benim için işe yaramadı, belki de VS2008 nedeniyle?), Bir dosya oluşturan, bu dosyayı ekleyerek (sürüm özelliklerini içeren) ve sonra okuma yolu kullanarak bu değerleri tekrar. Yani..

Ön Yap-Etkinlik:

echo [assembly:System.Reflection.AssemblyFileVersion("%date:~-4,4%.%date:~-7,2%%date:~-10,2%.%time:~0,2%%time:~3,2%.%time:~-5,2%")] > $(ProjectDir)Properties\VersionInfo.cs

Sonuçta ortaya çıkan VersionInfo.cs dosyasını (Özellikler alt klasörü) projenize ekleyin

Tarih'i geri almak için kod (yıllar saniye saniye):

var version = assembly.GetName().Version;
var fileVersionString = System.Diagnostics.FileVersionInfo.GetVersionInfo(assembly.Location).FileVersion;
Version fileVersion = new Version(fileVersionString);
var buildDateTime = new DateTime(fileVersion.Major, fileVersion.Minor/100, fileVersion.Minor%100, fileVersion.Build/100, fileVersion.Build%100, fileVersion.Revision);

Çok rahat değil .. Ayrıca, bir sürü kuvvet yeniden inşa yaratır mı bilmiyorum (çünkü bir dosya her zaman değişir).

Örneğin yalnızca birkaç dakika / saatte bir VersionInfo.cs dosyasını güncelleştirirseniz (geçici bir dosya kullanarak ve yeterince büyük bir değişiklik algılanırsa gerçek VersionInfo.cs dosyasını kopyalayıp üzerine yazarak) daha akıllı hale getirebilirsiniz. Bunu bir kez oldukça başarılı bir şekilde yaptım.


Mükemmel çalışıyor. Bununla birlikte, bu normal ifade% date: ~ -4,4%.% Date: ~ -7,2 %% tarih: ~ -10,2%.% Süre: ~ 0,2 %% süre: ~% 3,2 .% time: ~ -5,2% "çok karmaşık.
Cary

5

Sürüm numarasını "1.0. *" Olarak ayarlayın, son iki sayıyı otomatik olarak tarih (bir noktadan günler) ve saatle (gece yarısından yarım saniye) doldurur


Hey başlangıçta bunu düzgün okumuş olsaydım, kendimi mucho agro kurtarırdım. thx
inspite


4

Kek AssemblyInfo dosyaları yama destekler. Ellerde kek ile otomatik versiyon artışını uygulamak için sonsuz yollara sahipsiniz.

C # derleyicisi gibi artan sürümün basit bir örneği:

Setup(() =>
{
    // Executed BEFORE the first task.
    var datetimeNow = DateTime.Now;
    var daysPart = (datetimeNow - new DateTime(2000, 1, 1)).Days;
    var secondsPart = (long)datetimeNow.TimeOfDay.TotalSeconds/2;
    var assemblyInfo = new AssemblyInfoSettings
    {
        Version = "3.0.0.0",
        FileVersion = string.Format("3.0.{0}.{1}", daysPart, secondsPart)
    };
    CreateAssemblyInfo("MyProject/Properties/AssemblyInfo.cs", assemblyInfo);
});

Buraya:

  • Sürüm - montaj sürümüdür. En iyi uygulama, ana sürüm numarasını kilitlemek ve sıfırlarla ("1.0.0.0" gibi) kalmaktır.
  • FileVersion - montaj dosyasının sürümüdür.

Yalnızca sürümleri değil, diğer gerekli tüm bilgileri de ekleyebileceğinizi unutmayın .


3

Projeye Git | Özellikler ve sonra Montaj Bilgileri ve sonra Montaj Sürümü ve son veya ikinci-son kutuya * koyun (Ana veya Küçük bileşenleri otomatik olarak artıramazsınız).


2

MSBuild Topluluk Görevleri ( http://msbuildtasks.tigris.org/ ) projesindeki AssemblyInfo görevini kullanın ve .csproj / .vbproj dosyanıza entegre edin.

Sürüm numarasını günün tarihine ve saatine bağlamak için bir dizi seçenek vardır.

Önerilen.


2

Şu an itibariyle başvurum için,

string ver = Application.ProductVersion;

İadeler ver = 1.0.3251.27860

3251 değeri 1/1/2000'den bu yana geçen gün sayısıdır. Uygulamamın açılış ekranına bir sürüm oluşturma tarihi koymak için kullanıyorum. Bir kullanıcıyla uğraşırken, iletişim kurmak için bazı uzun numaralardan daha kolay olan oluşturma tarihini sorabilirim.

(Ben küçük bir şirketi destekleyen tek kişilik bir borçluyum. Bu yaklaşım sizin için işe yaramayabilir.)


Numaranız hızla tükenecek. En fazla programınız 2065 yılına kadar derlenecek ve en azından programınız 2065 yılına kadar derlenecekti. programınız o tarihte hala komisyonda!
AaA

2

AssemblyInfo'nun değiştirilmesi VS2012'de çalışır. Visual Studio'da bunun için daha fazla destek olmaması garip görünüyor, bunun oluşturma / bırakma işleminin temel bir parçası olduğunu düşünürdünüz.


2

Sürüm nasıl edinilir {major}.{year}.1{date}.1{time}

Bu biraz deneysel, ama hoşuma gidiyor. Esinlenen Jeff Atwood @ CodingHorror ( bağlantı ).

Ortaya çıkan sürüm numarası olur 1.2016.10709.11641(yani 2016-07-09 16:41),

  • Zayıf adamın sıfır dolgusu (aptal liderlerle 1)
  • sürüm numarasına gömülü neredeyse insan tarafından okunabilir yerel DateTime
  • gerçekten büyük kırılma değişiklikleri için Binbaşı sürümünü yalnız bırakarak.

Genel'i seçin projenize yeni bir öğe ekleyin -> Metin Şablon, o gibi bir isim CustomVersionNumberdışarı ve (varsa) yorumunu AssemblyVersionve AssemblyFileVersioniçinde Properties/AssemblyInfo.cs.

Ardından, bu dosyayı kaydederken veya projeyi .csoluştururken, oluşturulan .ttdosyanın altında bir alt öğe olarak bulunan bir dosya yeniden oluşturulur .

<#@ template language="C#" #>
<#@ assembly name="System.Core" #>
<#@ import namespace="System.Linq" #>

//
// This code was generated by a tool. Any changes made manually will be lost
// the next time this code is regenerated.
//

using System.Reflection;

<#
    var date = DateTime.Now;
    int major = 1;
    int minor = date.Year;
    int build = 10000 + int.Parse(date.ToString("MMdd"));
    int revision = 10000 + int.Parse(date.ToString("HHmm"));
#>

[assembly: AssemblyVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]
[assembly: AssemblyFileVersion("<#= $"{major}.{minor}.{build}.{revision}" #>")]

Programınızı her dakika derlemiyorsunuz veya günde bir kereden fazla konuşlandırmıyorsunuz, bu yüzden teknik olarak zaman kısmı gereksiz yere değerli bilgiler kullanıyor, büyük küçükler için 1. ve 2. ve sadece yyddd tarihi için 3. sayıyı (iki basamaklı yıl + ddd günü aynı yılın başlangıcından itibaren) ve artımlı sürüm numarası için 4.'ü bırakın.
AaA

2

Dosya sürümünü otomatik olarak artırmak için bir uygulama oluşturdum.

  1. Uygulamayı İndir
  2. pre-build event komut satırına aşağıdaki satırı ekleyin

    C: \ temp \ IncrementFileVersion.exe $ (SolutionDir) \ Properties \ AssemblyInfo.cs

  3. Projeyi derleyin

Basit tutmak için uygulama sadece bir hata varsa mesaj atar, iyi çalıştığını onaylamak için 'Montaj Bilgileri' içindeki dosya sürümünü kontrol etmeniz gerekir

Not: Alanları doldurmak için çözümü 'Montaj Bilgileri' düğmesi için Visual studio'da yeniden yüklemeniz gerekir, ancak çıktı dosyanızın güncellenmiş sürümü olacaktır.

Öneri ve istekleriniz için telson_alva@yahoo.com adresine e-posta gönderebilirsiniz.


2

Visual Studio 2019'da

Eklemek benim için yeterli değildi

[assembly: AssemblyVersion("1.0.*")]

İnşa ederken bana bu hatayı atar

Belirtilen sürüm dizesi gerekli biçime uymuyor

Çözüm

Biçim nihayet Sette sonra kabul edildi Deterministiciçin Falsedeproject.csproj

<Deterministic>false</Deterministic>

Düzenle:

Nedense ayarı için Deterministiciçin Falseberbat benim yapılandırma dosyasında yüklenerek farklı yerlerde kaydederek.

Çözüm:

Düzeltme numarasını artırmak için bir post-build olayı kurmak:

Derleme Sonrası Etkinlik toplu komut dosyası

Buna autoincrement_version.ps1argüman olarak iletme adı verilen bir powershell betiğiAssemblyInfo.cs

if $(ConfigurationName) == Release (
PowerShell -ExecutionPolicy RemoteSigned $(ProjectDir)autoincrement_version.ps1 '$(ProjectDir)My Project\AssemblyInfo.cs'
)

Poweshell alfabesi

Regex kullanarak revizyon numarasını otomatik olarak artırır

param( [string]$file );
  $regex_revision = '(?<=Version\("(?:\d+\.)+)(\d+)(?="\))'
  $found = (Get-Content $file) | Select-String -Pattern $regex_revision
  $revision = $found.matches[0].value
  $new_revision = [int]$revision + 1
  (Get-Content $file) -replace $regex_revision, $new_revision | Set-Content $file -Encoding UTF8

1

Belki bu görev için şu kodu kullanabilirsiniz:

    private bool IncreaseFileVersionBuild()
    {
        if (System.Diagnostics.Debugger.IsAttached)
        {
            try
            {
                var fi = new DirectoryInfo(AppDomain.CurrentDomain.BaseDirectory).Parent.Parent.GetDirectories("Properties")[0].GetFiles("AssemblyInfo.cs")[0];
                var ve = System.Diagnostics.FileVersionInfo.GetVersionInfo(System.Reflection.Assembly.GetExecutingAssembly().Location);
                string ol = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + ve.FileBuildPart.ToString() + "." + ve.FilePrivatePart.ToString();
                string ne = ve.FileMajorPart.ToString() + "." + ve.FileMinorPart.ToString() + "." + (ve.FileBuildPart + 1).ToString() + "." + ve.FilePrivatePart.ToString();
                System.IO.File.WriteAllText(fi.FullName, System.IO.File.ReadAllText(fi.FullName).Replace("[assembly: AssemblyFileVersion(\"" + ol + "\")]", "[assembly: AssemblyFileVersion(\"" + ne + "\")]"));
                return true;
            }
            catch
            {
                return false;
            }
        }
        return false;
    }

ve form yüklenmesinden çağırın.
Bu kodla, dosya bilgilerinin herhangi bir bölümünü AssemblyInfo.cs dosyasında güncelleyebilirsiniz (ancak "standart" dizin yapısını kullanmanız gerekir).




1

Belki burada cevap vermek için çok geç ama umarım birinin telaşlı sorununu çözecektir.

PowerShell betiğini kullanarak tüm projelerinizin montaj sürümünü değiştirmenin otomatik bir yolu. Bu makale sorunlarınızın çoğunu çözecektir.


PS ile ilgili tek sorun, yavaş tepki vermesi ve çalışmasına izin vermek için yapılandırma gerektirmesidir. Herhangi bir programcının bir şekilde yazabileceğini düşündüğüm küçük bir yürütülebilir dosya, bir tt4 dosyası veya hatta satır içi kod ile giderdim.
AaA

0

Her yapı yaptığımda otomatik olarak en küçük rakamı arttırır.

Diğerlerini nasıl güncelleyeceğime dair hiçbir fikrim yok, ama en azından bunu zaten görüyor olmalısın ...


1
VS, genellikle yapı numarası olan son sayıyı arttırmaktan sorumludur. Diğer her şey (yani ondan önceki sayılar) size bağlıdır çünkü uygulamanızın sürümünü temsil ederler.
Огњен Шобајић

1
Огњен Шобајић: Pek doğru değil. Microsoft'un numaralandırma şeması major.minor.build.revision, örneğin 1.0.4.7'dir. Derleme sürümünü "1.0. *" Gibi bir değere ayarlarsanız, VS sizin için derleme ve düzeltme numaralarını ayarlayacaktır. Bu durumda derleme günlük olarak artacak ve revizyon gece yarısından bu yana geçen saniye sayısı 2'ye bölünecektir.
Simon Tewsi

0

Tortoise Subversion kullanan herkes için sürüm numaralarınızdan birini kaynak kodunuzun subversion Revizyon numarasına bağlayabilirsiniz. Bunu çok faydalı buluyorum (Denetçiler de bunu gerçekten seviyor!). Bunu, ön derlemenizdeki WCREV yardımcı programını çağırarak ve bir şablondan AssemblyInfo.cs dosyanızı oluşturarak yaparsınız.

Şablonunuz AssemblyInfo.wcrev olarak adlandırılır ve normal AssemblyInfo.cs dizininde oturursa ve kaplumbağa varsayılan yükleme dizinindeyse, Pre-Build komutunuz şöyle görünür (NB Hepsi bir satırda):

"C:\Program Files\TortoiseSVN\bin\SubWCRev.exe" "$(ProjectDir)." "$(ProjectDir)Properties\AssemblyInfo.wcrev"  "$(ProjectDir)Properties\AssemblyInfo.cs"

Şablon dosyası wcrev belirteci değiştirme dizesini içerir: $ WCREV $
eg

[assembly: AssemblyFileVersion("1.0.0.$WCREV$")]

Not:
AssemblyInfo.cs dosyanız şimdi oluşturulduğundan, sürümün denetlenmesini istemezsiniz.

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.