Czy Mogę automatycznie zwiększyć wersję kompilacji plików podczas korzystania z Visual Studio?

Zastanawiałem się, jak Mogę automatycznie zwiększyć kompilację (i wersję?) moich plików przy użyciu programu Visual Studio (2005).

Jeśli poszukam właściwości say C:\Windows\notepad.exe, Karta wersja daje "Wersja pliku: 5.1.2600.2180". Chciałbym dostać te fajne numery w wersji mojego dll też, a nie w wersji 1.0.0.0, co powiedzmy szczerze, jest nieco nudne.

Próbowałem kilku rzeczy, ale to nie wygląda na funkcjonalność out-of-box, a może po prostu patrzę w złym miejsce (jak zwykle).

Pracuję głównie z projektami internetowymi....

Spojrzałem na oba:

  1. http://www.codeproject.com/KB/dotnet/Auto_Increment_Version.aspx
  2. http://www.codeproject.com/KB/dotnet/build_versioning.aspx
I nie mogłem uwierzyć, że tak wiele wysiłku, aby coś zrobić, jest standardową praktyką.

Edytuj: to nie działa w VS2005 o ile mogę powiedzieć ( http://www.codeproject.com/KB/dotnet/AutoIncrementVersion.aspx)

Author: pb2q, 2008-12-10

23 answers

W visual Studio 2008, następujące prace.

Znajdź AssemblyInfo.plik cs i znajdź te 2 linie:

[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]
Możesz spróbować zmienić to na:
[assembly: AssemblyVersion("1.0.*")]
[assembly: AssemblyFileVersion("1.0.*")]

Ale to nie da ci pożądanego rezultatu, skończysz z wersją Produktu 1.0.* oraz plik w wersji 1.0.0.0. Nie tego chcesz!

Jeśli jednak usuniesz drugą z tych linii i po prostu masz:

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

Wtedy kompilator ustawi wersję pliku na równą do wersji produktu, a otrzymasz pożądany wynik automatycznego zwiększania produktu i wersji pliku, które są zsynchronizowane. E. g. 1.0.3266.92689

 394
Author: Sam Meldrum,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-10 16:35:54

Otwórz AssemblyInfo.plik cs i zmiana

// 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")]

Do

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

Możesz to zrobić w IDE, przechodząc do project -> properties - > Assembly information

To jednak pozwoli Ci tylko na automatyczne zwiększanie wersji montażowej i da ci

Wersja pliku Assembly: w tym polu nie wolno używać symbolu wieloznacznego ( " * " )

Okno wiadomości, Jeśli spróbujesz umieścić * w polu Wersja pliku.

Więc po prostu otwórz assemblyinfo.cs i do to ręcznie.

 146
Author: Hath,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-20 23:16:44

Inną opcją zmiany numerów wersji w każdym build jest użycie Version zadania MSBuild.Społeczność.Zadania . Po prostu pobierz ich instalator, zainstaluj go, a następnie dostosuj poniższy kod i wklej go po <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> do pliku .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>

uwaga: Dostosuj właściwość StartDate do ustawień regionalnych. obecnie nie używa Kultury niezmienniczej.

Dla trzeciego builda z 14 stycznia 2010, tworzy to VersionInfo.cs z tym treść:

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

Ten plik musi zostać dodany do projektu (poprzez Dodaj istniejący element ), a linie AssemblyVersion i AssemblyFileVersion muszą zostać usunięte z AssemblyInfo.cs.

Różne algorytmy zmiany składników wersji są opisane w $(MSBuildExtensionsPath)\MSBuildCommunityTasks\MSBuild.Community.Tasks.chm i właściwości wersji.

 50
Author: Christian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-18 09:02:59

Wymyśliłem rozwiązanie podobne do chrześcijańskich, ale bez polegania na zadaniach MSBuild społeczności, nie jest to dla mnie opcja, ponieważ nie chcę instalować tych zadań dla wszystkich naszych programistów.

Generuję kod i kompiluję do zestawu i chcę automatycznie zwiększać numery wersji. Jednak nie mogę użyć VS 6.0.* Sztuczka AssemblyVersion, ponieważ automatycznie zwiększa liczbę kompilacji każdego dnia i zrywa kompatybilność z zestawami, które używają starszego numeru kompilacji. Zamiast Tego, Ja chcesz mieć mocno zakodowaną wersję AssemblyVersion, ale Auto-incrementującą AssemblyFileVersion. Udało mi się to poprzez podanie AssemblyVersion w AssemblyInfo.cs i generowanie wersji.cs w MSBuild jak to,

  <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>

Spowoduje wygenerowanie VersionInfo.plik cs z atrybutem Assemblyfileversion dla AssemblyFileVersion, gdzie wersja jest zgodna ze schematem YY. MM. DD. TTTT z datą kompilacji. Musisz dołączyć ten plik do swojego projektu i zbudować z nim.

 22
Author: Boog,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-25 17:08:09

Zainstaluj dodatek Build Version Increment . Daje to o wiele większą kontrolę niż opcja*.

 16
Author: Ryan Gates,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-09-25 20:46:43

Aby uzyskać numery wersji spróbuj

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

Aby ustawić numer wersji, Utwórz / edytuj AssemblyInfo.cs

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

Również na marginesie, trzecia liczba to liczba dni od 2/1/2000, a czwarta liczba to połowa całkowitej liczby sekund w ciągu dnia. Więc jeśli skompilujesz o północy powinno być zero.

 12
Author: Bob,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-23 15:59:36

Ustawienie * w numerze wersji w AssemblyInfo lub we właściwościach projektu, jak opisano w innych postach, nie działa ze wszystkimi wersjami Visual Studio/. NET.

Afaik to nie działało w VS 2005 (ale w VS 2003 i VS 2008). Dla VS 2005 można użyć: Auto Increment Visual Studio 2005 Wersja kompilacji i numer wersji w czasie kompilacji.

Należy jednak pamiętać, że automatyczna zmiana numeru wersji nie jest zalecana dla strong-named / align = "left" / Powodem jest to, że wszystkie odniesienia do takiego złożenia muszą być aktualizowane za każdym razem, gdy odwołany zespół jest przebudowywany ze względu na fakt, że silnie nazwane odniesienia do złożenia są zawsze odniesieniem do konkretnej wersji złożenia. Sam Microsoft zmienia numer wersji złożeń. NET Framework tylko wtedy, gdy występują zmiany w interfejsach. (NB: nadal szukam linku w MSDN, gdzie to przeczytałem.)

 8
Author: Dirk Vollmar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-10 16:03:28

Ustaw numer wersji na "1.0.* "i automatycznie wypełni dwie ostatnie liczby datą (w dniach od pewnego punktu) i czasem (połowa sekund od północy)

 5
Author: James Curran,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-10 15:54:35

Aby uzyskać informacje o inkrementacji (DateTime) do Właściwości AssemblyFileVersion, która ma tę zaletę, że nie łamie żadnych zależności.


Bazując na rozwiązaniu Booga (nie zadziałało u mnie, może z powodu VS2008?), można użyć kombinacji zdarzenia pre-build generującego plik, dodając ten plik (wraz z jego właściwościami wersji), a następnie ponownie odczytać te wartości. Tak..

Pre-Build-Event:

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

Załącz wynik VersionInfo.plik cs (podfolder właściwości) do twojego projektu

Kod do cofnięcia daty (lata w dół do sekund):

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);
Niezbyt wygodne.. poza tym Nie wiem, czy tworzy dużo Force-rebuilds (ponieważ plik zawsze się zmienia).

Możesz uczynić go mądrzejszym na przykład, jeśli zaktualizujesz tylko VersionInfo.plik cs co kilka minut/godzin (używając pliku tymczasowego, a następnie kopiując / nadpisując rzeczywistą Wersjęinfo.cs, jeśli zostanie wykryta zmiana wystarczająco duża). Zrobiłem to. raz całkiem pomyślnie.

 5
Author: Andreas Reiff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-10 18:37:31

Istnieje rozszerzenie visual studio Automatyczne wersje , które obsługuje Visual Studio 2012, 2013, 2015 i 2017.

Zrzuty Ekranu Tutaj wpisz opis obrazka

Tutaj wpisz opis obrazka

 5
Author: Rahul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-30 08:24:45

Znajduje się we właściwościach twojego projektu pod Publikuj

http://screencast.com/t/Vj7rhqJO
(~ http://screencast.com/t/Vj7rhqJO )

 4
Author: Alex,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-08 14:09:22

Cake obsługuje łatanie plików AssemblyInfo. Z cake w rękach masz nieskończone sposoby, aby wdrożyć automatyczną wersję inkrementacji.

Prosty przykład zwiększania wersji tak jak robi to kompilator C#:

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);
});

TUTAJ:

  • Version-jest wersją montażową. Najlepszą praktyką jest zablokowanie głównego numeru wersji i pozostawienie pozostałych zerami (jak "1.0.0.0").
  • FileVersion-jest wersją Pliku assembly.

Zauważ, że możesz łatać nie tylko wersje, ale również wszystkie inne niezbędne informacje .

 4
Author: hal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-03 19:27:56

Przejdź do Project / Properties, a następnie Assembly Information, a następnie Assembly Version i umieść * w polu last lub second-to-last (nie możesz automatycznie zwiększać Głównych lub pomniejszych komponentów).

 3
Author: MusiGenesis,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-10 16:01:17

Użyj zadania AssemblyInfo z zadań społeczności MSBuild ( http://msbuildtasks.tigris.org / ) projekt, i zintegrować go z Twoim .csproj/plik vbproj.

Ma wiele opcji, w tym jedną, aby powiązać numer wersji z datą i godziną dnia.

Zalecane.

 2
Author: devstuff,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-15 05:20:35

Od teraz, dla mojego wniosku,

string ver = Application.ProductVersion;

Zwraca ver = 1.0.3251.27860

Wartość 3251 jest liczbą dni od 1/1/2000. Używam go, aby umieścić datę utworzenia wersji na ekranie powitalnym mojej aplikacji. Mając do czynienia z użytkownikiem, mogę zapytać o datę utworzenia, która jest łatwiejsza do komunikowania niż jakiś długi numer.

(Jestem jednoosobowym działem wspierającym małą firmę. Takie podejście może nie działać dla Ciebie.)
 2
Author: SeaDrive,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-10-03 09:41:59

Zmiana AssemblyInfo działa w VS2012. Wydaje się dziwne, że nie ma więcej wsparcia dla tego w Visual Studio, można by pomyśleć, że to była podstawowa część procesu budowania/wydawania.

 2
Author: Maxcelcat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-24 06:01:49

Jak uzyskać wersję {major}.{year}.1{date}.1{time}

Ten jest trochę eksperymentalny, ale podoba mi się. Zainspirowany Jeff Atwood @ CodingHorror (link ).

Otrzymany numer wersji staje się 1.2016.10709.11641 (czyli 2016-07-09 16: 41), co pozwala na

  • poor mans zero padding (with the stupid leading 1s)
  • prawie czytelny dla człowieka lokalny DateTime Wbudowany W Numer wersji
  • zostawiając główną wersję samą dla naprawdę poważnego złamania zmiany.

Dodaj nowy element do swojego projektu, wybierz Ogólne - > szablon tekstowy, nadaj mu nazwę CustomVersionNumber i (w stosownych przypadkach) skomentuj AssemblyVersion i AssemblyFileVersion W Properties/AssemblyInfo.cs.

Następnie, podczas zapisywania tego pliku lub budowania projektu, spowoduje to regenerację pliku .cs znajdującego się jako element podrzędny w utworzonym pliku .tt.

<#@ 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}" #>")]
 2
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-09 14:52:41

Być może do tego zadania możesz użyć kodu w następujący sposób:

    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;
    }

I wywołaj to z wczytywania formularza.
Za pomocą tego kodu możesz zaktualizować dowolną część informacji o pliku w AssemblyInfo.cs (ale musisz użyć "standardowej" struktury katalogów).

 1
Author: Atiris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-13 22:26:24

AssemblyInfoUtil . Za darmo. Open-source.

 1
Author: Sergiy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-05-08 06:30:01

Używam tego podejścia https://stackoverflow.com/a/827209/3975786 umieszczając szablon T4 w "elementach rozwiązania" i używając go z "Dodaj jako Link" w każdym projekcie.

 1
Author: mcandal,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:57

Może jest już za późno, aby odpowiedzieć tutaj, ale mam nadzieję, że to rozwiąże czyjś gorączkowy problem.

Automatyczny sposób zmiany wersji assembly wszystkich projektów za pomocą skryptu PowerShell. Ten artykuł rozwiąże wiele twoich problemów.

 1
Author: Khawaja Asim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-04 05:40:15

Za każdym razem, gdy robię build it, automatycznie przyrosty najmniej znaczącej cyfry.

Nie mam pojęcia, jak zaktualizować Pozostałe, ale powinieneś już to zobaczyć...

 0
Author: Brian Knoblauch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-12-10 15:54:06

Utworzyłem aplikację do automatycznego zwiększania wersji pliku.

  1. Pobierz Aplikacja
  2. Dodaj następujący wiersz do pre-build event command line

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

  3. Zbuduj projekt

Aby zachować to proste aplikacja wysyła wiadomości tylko wtedy, gdy jest błąd, aby potwierdzić, że działa dobrze, musisz sprawdzić wersję pliku w ' Assembly Informacje "

Uwaga: aby wypełnić pola, konieczne będzie ponowne wczytanie rozwiązania w programie Visual studio dla przycisku 'Assembly Information', jednak plik wyjściowy będzie miał zaktualizowaną wersję.

W sprawie sugestii i próśb proszę pisać do mnie na [email protected]

 0
Author: Telson Alva,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-23 11:33:30