Jakie są najlepsze praktyki korzystania z atrybutów złożenia?

Mam rozwiązanie z wieloma projektami. Próbuję zoptymalizować AssemblyInfo.pliki cs łącząc jedno rozwiązanie szeroki plik informacji montażu. Jakie są najlepsze praktyki w tym zakresie? Które atrybuty powinny znajdować się w pliku rozwiązania, a które są specyficzne dla projektu/montażu?


Edit: jeśli jesteś zainteresowany, istnieje dodatkowe pytanie Jakie są różnice między AssemblyVersion, AssemblyFileVersion i AssemblyInformationalVersion?

Author: Community, 2008-09-15

8 answers

Używamy pliku globalnego o nazwie GlobalAssemblyInfo.cs i lokalny o nazwie AssemblyInfo.cs. Plik globalny zawiera następujące atrybuty:

 [assembly: AssemblyProduct("Your Product Name")]

 [assembly: AssemblyCompany("Your Company")]
 [assembly: AssemblyCopyright("Copyright © 2008 ...")]
 [assembly: AssemblyTrademark("Your Trademark - if applicable")]

 #if DEBUG
 [assembly: AssemblyConfiguration("Debug")]
 #else
 [assembly: AssemblyConfiguration("Release")]
 #endif

 [assembly: AssemblyVersion("This is set by build process")]
 [assembly: AssemblyFileVersion("This is set by build process")]

The local AssemblyInfo.cs zawiera następujące atrybuty:

 [assembly: AssemblyTitle("Your assembly title")]
 [assembly: AssemblyDescription("Your assembly description")]
 [assembly: AssemblyCulture("The culture - if not neutral")]

 [assembly: ComVisible(true/false)]

 // unique id per assembly
 [assembly: Guid("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx")]

Możesz dodać GlobalAssemblyInfo.cs przy użyciu następującej procedury:

  • Wybierz Dodaj / Istniejący Element... w menu kontekstowym projektu
  • Wybierz GlobalAssemblyInfo.cs
  • rozwiń przycisk Dodaj, klikając na ta mała strzałka w dół po prawej dłoni
  • wybierz "Dodaj jako Link" z listy rozwijanej przycisków
 198
Author: JRoppert,
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-04-08 08:16:09

W moim przypadku budujemy produkt, dla którego mamy rozwiązanie Visual Studio, z różnymi komponentami we własnych projektach. Wspólne atrybuty go. W rozwiązaniu jest około 35 projektów i wspólne informacje o montażu (CommonAssemblyInfo.cs), który posiada następujące atrybuty:

[assembly: AssemblyCompany("Company")]
[assembly: AssemblyProduct("Product Name")]
[assembly: AssemblyCopyright("Copyright © 2007 Company")]
[assembly: AssemblyTrademark("Company")]

//This shows up as Product Version in Windows Explorer
//We make this the same for all files in a particular product version. And increment it globally for all projects.
//We then use this as the Product Version in installers as well (for example built using Wix).
[assembly: AssemblyInformationalVersion("0.9.2.0")]

Inne atrybuty, takie jak Assemblytle, AssemblyVersion itp., Dostarczamy na zasadzie montażu. Podczas budowania zespołu zarówno AssemblyInfo.cs i CommonAssemblyInfo.CS są budowane do każdego zespołu. To daje nam najlepsze z obu światów, w których możesz chcieć mieć wspólne atrybuty dla wszystkich projektów i konkretne wartości dla niektórych innych.

Mam nadzieję, że to pomoże.
 17
Author: Krishna,
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-09-15 13:14:27

Rozwiązanie przedstawione przez @JRoppert jest prawie takie samo, jak to, co robię. Jedyną różnicą jest to, że umieściłem następujące linie w lokalnym AssemblyInfo.plik cs, ponieważ mogą się one różnić w zależności od zestawu:

#if DEBUG
[assembly: AssemblyConfiguration("Debug")]
#else
[assembly: AssemblyConfiguration("Release")]
#endif
[assembly: AssemblyVersion("This is set by build process")]
[assembly: AssemblyFileVersion("This is set by build process")]
[assembly: CLSCompliant(true)]

Używam również (ogólnie) jednej wspólnej informacji o montażu na rozwiązanie, przy założeniu, że jedno rozwiązanie jest pojedynczą linią produktów / produktem do uwalniania. Plik Common assembly info zawiera również:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Który ustawi wartość "ProductVersion" wyświetlaną przez Windows Explorer.

 12
Author: Scott Dorman,
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-09-15 14:01:20

MSBuild Community Tasks zawiera niestandardowe zadanie o nazwie AssemblyInfo, którego możesz użyć do wygenerowania assemblyinfo.cs. Wymaga to ręcznej edycji plików csproj, ale warto.

 8
Author: jlew,
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-14 00:31:30

Moim zdaniem przy użyciu GlobalAssemblyInfo.cs jest większy problem niż warto, ponieważ musisz zmodyfikować każdy plik projektu i pamiętaj, aby zmodyfikować każdy nowy projekt, a otrzymasz AssemblyInfo.cs domyślnie.

W przypadku zmian globalnych wartości (tj. firmy, produktu itp.) zmiany są zwykle tak rzadkie i proste w zarządzaniu, że nie sądzę, abysucha powinna być brana pod uwagę. Po prostu uruchom następujący skrypt MSBuild (zależny od MSBuild Extension Pack), gdy chcesz ręcznie zmienić wartości we wszystkich projektach jako jednorazową:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" DefaultTargets="UpdateAssemblyInfo" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>
        <AllAssemblyInfoFiles Include="..\**\AssemblyInfo.cs" />
    </ItemGroup>

    <Import Project="MSBuild.ExtensionPack.tasks" />

  <Target Name="UpdateAssemblyInfo">
    <Message Text="%(AllAssemblyInfoFiles.FullPath)" />
    <MSBuild.ExtensionPack.Framework.AssemblyInfo 
        AssemblyInfoFiles="@(AllAssemblyInfoFiles)"
        AssemblyCompany="Company"
        AssemblyProduct="Product"
        AssemblyCopyright="Copyright"
        ... etc ...
        />
  </Target>

</Project>
 4
Author: Schneider,
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-08-04 11:18:09

Aby udostępnić plik między wieloma projektami, możesz dodać istniejący plik jako łącze.

Aby to zrobić, Dodaj istniejący plik i kliknij "Dodaj jako łącze" w selektorze plików.Dodaj jako Link http://laurent.etiemble.free.fr/dotclear/images/AddLinkedFile03_tn.png

Jeśli chodzi o to, co umieścić w udostępnionym pliku, sugerowałbym umieszczenie rzeczy, które byłyby współdzielone między zespołami. Takie rzeczy jak Prawa autorskie, firma, może Wersja.

 3
Author: Cameron MacFarland,
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-09-15 13:10:38

Używanie pojedynczego AseemblyInfo.plik cs dla wielu projektów nie jest zalecany. Plik AssemblyInfo zawiera informacje, które mogą być istotne tylko dla danego złożenia. Dwie najbardziej oczywiste informacje to AssemblyTitle i AssemblyVersion.

Lepszym rozwiązaniem może być użycie pliku targets, który jest obsługiwany przez MSBuild, w celu "wtrysku" atrybutów złożenia do więcej niż jednego projektu.

 1
Author: SaguiItay,
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-09-15 13:04:04

Jedną z rzeczy, które uznałem za przydatne, jest wygenerowanie elementów AssemblyVersion (etc) poprzez zastosowanie zastępowania tokenów w fazie pre-build.

Używam TortoiseSvn i łatwo jest użyć jego SubWCRev.exe, aby przekształcić szablon AssemblyInfo.wcrev w AssemblyInfo.cs. Odpowiednia linia w szablonie może wyglądać mniej więcej tak:

[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]

Trzecim elementem jest numer wersji. Używam czwartego elementu, aby sprawdzić, czy nie zapomniałem zatwierdzić żadnych nowych lub zmienionych plików (czwarty element to 00, jeśli jest Wszystko OK).

Przy okazji, dodaj AssemblyInfo.wcrev do swojej kontroli wersji i zignoruj AssemblyInfo.cs jeśli użyjesz tego.

 1
Author: John Denniston,
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-09-06 16:25:15