Які найкращі практики використання атрибутів збірки?


163

У мене є рішення з декількома проектами. Я намагаюся оптимізувати файли AssemblyInfo.cs, пов'язуючи один інформаційний файл із широкою збіркою рішення. Які найкращі практики для цього? Які атрибути повинні бути у файлі, що має широке рішення, а які конкретні для проекту / складання?


Редагувати: Якщо вас цікавить, виникає додаткове запитання. Чим відрізняються AssemblyVersion, AssemblyFileVersion та AssemblyInformationalVersion?

Відповіді:


207

Ми використовуємо глобальний файл під назвою GlobalAssemblyInfo.cs і локальний, який називається AssemblyInfo.cs. Глобальний файл містить такі атрибути:

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

Місцевий AssemblyInfo.cs містить такі атрибути:

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

Ви можете додати GlobalAssemblyInfo.cs, використовуючи наступну процедуру:

  • У контекстному меню проекту виберіть Додати / існуючий елемент ...
  • Виберіть GlobalAssemblyInfo.cs
  • Розгорніть кнопку "Додати", натиснувши на цю маленьку стрілку вниз праворуч
  • Виберіть "Додати як посилання" у спадному списку кнопок

яка мета збереження старих файлів AssemblyInfo.cs? Коли я автоматизую свій штамп версії збірки в GlobalAssemblyInfo.cs, як це оновлення файлів AssemblyInfo.cs у мене в моєму рішенні?
D3vtr0n

3
@Devtron Окремі файли AssemblyInfo повинні надавати унікальну інформацію для збірки, в якій вони перебувають (наприклад, назва, опис та культура, як у прикладі вище). Поширені записи, такі як назва продукту та інформація про версії, слід видалити (і вони спричинить помилку компілятора, якщо вони дублюються). В ідеалі файли AssemblyInfo не буде оновлюватися процесом збирання.
David Keaveny

1
AssemblyCultureAttributeЗаслуговує на краще пояснення. Атрибут повинен найкраще відсутній повністю (якщо тільки це не супутникова збірка). При широкомасштабному використанні супутникових збірок може знадобитися три, а не два рівні файлів інформації про збірку (глобальний, основний і супутниковий збір, який лише визначає культуру в цьому випадку).
Jirka Hanika

20

У моєму випадку ми будуємо продукт, для якого у нас є рішення Visual Studio, з різними компонентами у власних проектах. Загальні атрибути йдуть. У рішенні є близько 35 проектів та загальна інформація про збірку (CommonAssemblyInfo.cs), яка має такі атрибути:

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

Інші атрибути, такі як AssemblyTitle, AssemblyVersion тощо, ми надаємо на основі складання. Під час створення збірки в кожну збірку вбудовуються і AssemblyInfo.cs, і CommonAssemblyInfo.cs. Це дає нам найкраще з обох світів, де ви можете мати загальні атрибути для всіх проектів та конкретні значення для деяких інших.

Сподіваюся, що це допомагає.


у вас 35+ записів у вашій конфігурації збірки для вирішення цього питання? Здається досить зайвим. Що робити, якщо ви додасте 2 або 3 нові проекти, чи не порушує це збірка, поки ви не додасте їх до завдання Версії?
D3vtr0n

1
@ D3vtr0n, чому «конфігурація побудови» (що ви маєте на увазі під цим) потребує стільки записів? Я припускаю, що цей файл включений до кожного .csproj through <Compile Include="$(MSBuildThisFileDirectory)..\Common\CommonAssemblyInfo.cs"/>, директиви MSBuild, яка навіть може бути у спільному Common.targetsфайлі. Yay код повторного використання.
бінкі

15

Рішення, представлене @JRoppert, майже те саме, що я роблю. Єдина відмінність полягає в тому, що я поміщаю наступні рядки у локальний файл AssemblyInfo.cs, оскільки вони можуть змінюватися в залежності від кожної збірки:

#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)]

Я також (як правило) використовую одну загальну інформацію про збірку за рішенням, з припущенням, що одне рішення є однією лінією продуктів / продуктом, що випускається. Файл інформації про спільну збірку також має:

[assembly: AssemblyInformationalVersion("0.9.2.0")]

Яке встановить значення "ProductVersion", відображене Windows Explorer.


8

Завдання спільноти MSBuild містить спеціальне завдання під назвою AssemblyInfo, яке ви можете використовувати для створення вашого Assemblyinfo.cs. Для використання потрібні невеликі редагування файлів csproj, але вони варті того.


6

На мою думку, використання GlobalAssemblyInfo.cs більше проблем, ніж це варто, тому що вам потрібно змінити кожен проект проекту і пам'ятати, щоб змінювати кожен новий проект, тоді як ви отримуєте AssemblyInfo.cs за замовчуванням.

Щодо змін глобальних цінностей (наприклад, компанії, товару тощо), зміни зазвичай такі рідкі і прості в управлінні, я не думаю, що DRY не повинен враховувати. Просто запустіть такий скрипт MSBuild (залежно від пакету розширень MSBuild ), коли ви хочете вручну змінити значення у всіх проектах як разові:

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

3

Для обміну файлом між декількома проектами ви можете додати наявний файл у якості посилання.

Для цього додайте існуючий файл та натисніть на "Додати як посилання" у селекторі файлів. (джерело: free.fr )Додати як посилання

Що стосується того, що потрібно розмістити у спільному файлі, я б запропонував розмістити речі, які були б спільними для всіх збірок. Такі речі, як авторське право, компанія, можливо версія.


1

Використання одного файлу AseemblyInfo.cs для кількох проектів не рекомендується. Файл AssemblyInfo включає інформацію, яка може бути актуальною лише для цієї конкретної збірки. Два найбільш очевидні відомості - це AssemblyTitleта AssemblyVersion.

Кращим рішенням може бути використання targetsфайлів, якими обробляється MSBuild, щоб "ввести" атрибути збірки в більш ніж один проект.


що робити, якщо у вас є 20+ проектів? Це вимагає, щоб я підтримував 20+ записів у моїй конфігурації збірки, лише для Versioning. Це здається справді кульгавим. Що робити, якщо я додам 2 або 3 нові проекти? Це обов'язково порушить процес збирання ... Будь-які ідеї, як вирішити це?
D3vtr0n

@ D3vtr0n Я думаю, що ідея полягає в тому, щоб динамічно генерувати відповідну збірку, а не підтримувати окремі конфігурації для кожного проекту. Завдання громади, я думаю, вирішує цей випадок.
Роман

1

Одне, що я вважаю корисним - це генерувати елементи AssemblyVersion (тощо), застосовуючи підстановку жетонів на фазі попереднього збирання.

Я використовую TortoiseSVN, і легко використовувати його , SubWCRev.exeщоб включити шаблон AssemblyInfo.wcrevв AssemblyInfo.cs. Відповідний рядок у шаблоні може виглядати приблизно так:

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

Третім елементом є ревізійний номер. Я використовую четвертий елемент, щоб перевірити, чи не забув я зробити будь-які нові або змінені файли (четвертий елемент - 00, якщо все гаразд).

До речі, додайте AssemblyInfo.wcrevдо свого контролю версій і ігноруйте, AssemblyInfo.cs якщо ви користуєтесь цим.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.