Каковы наилучшие методы использования ассемблеров сборки?
У меня есть решение с несколькими проектами. Я пытаюсь оптимизировать файлы AssemblyInfo.cs, связываясь с одним файлом информации об аксессуарах. Каковы наилучшие методы для этого? Какие атрибуты должны быть в широком разрешении и которые специфичны для проекта/сборки?
Редактирование: если вас интересует следующий вопрос Каковы различия между AssemblyVersion, AssemblyFileVersion и AssemblyInformationalVersion?
Ответы
Ответ 1
Мы используем глобальный файл 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
- Разверните кнопку "Добавить", нажав на эту маленькую стрелку вниз справа.
- Выберите "Добавить как ссылку" в раскрывающемся списке кнопок
Ответ 2
В моем случае мы создаем продукт, для которого у нас есть решение 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 встроена в каждую сборку. Это дает нам лучшее из обоих миров, где вы можете захотеть иметь некоторые общие атрибуты для всех проектов и конкретные значения для некоторых других.
Надеюсь, что это поможет.
Ответ 3
Решение, представленное @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.
Ответ 4
Задачи сообщества MSBuild содержит настраиваемую задачу AssemblyInfo, которую вы можете использовать для генерации вашей сборкиinfo.cs. Для этого требуется небольшое ручное редактирование ваших файлов csproj, но это стоит того.
Ответ 5
По-моему, использование GlobalAssemblyInfo.cs больше проблем, чем того стоит, потому что вам нужно изменить каждый файл проекта и не забудьте изменить каждый новый проект, в то время как вы по умолчанию получаете AssemblyInfo.cs.
Для изменений глобальных значений (например, Company, Product и т.д.) изменения обычно так редки и просты в управлении. Я не думаю, что DRY должно быть рассмотрено. Просто запустите следующий MSBuild script (в зависимости от MSBuild Extension Pack), когда вы хотите вручную изменить значения во всех проектах как однострочные, выключено:
<?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>
Ответ 6
Чтобы поделиться файлом между несколькими проектами, вы можете добавить существующий файл в качестве ссылки.
Чтобы сделать это, добавьте существующий файл и нажмите "Добавить как ссылку" в селектор файлов. Добавить как ссылку http://laurent. etiemble.free.fr/dotclear/images/AddLinkedFile03_tn.png
Что касается того, что добавить в общий файл, я бы предложил поместить вещи, которые будут совместно использоваться в сборках. Такие вещи, как авторское право, компания, возможно, версия.
Ответ 7
Использование одного файла AseemblyInfo.cs для нескольких проектов не рекомендуется.
Файл AssemblyInfo содержит информацию, которая может иметь отношение только к этой конкретной сборке. Двумя наиболее очевидными частями информации являются AssemblyTitle
и AssemblyVersion
.
Лучшим решением может быть использование файла targets
, который обрабатывается MSBuild, чтобы "внедрить" атрибуты сборки в несколько проектов.
Ответ 8
Одна вещь, которую я нашел полезной, - это сгенерировать элементы AssemblyVersion (и т.д.), применяя замену токена на фазе предварительной сборки.
Я использую TortoiseSvn, и его легко использовать SubWCRev.exe
, чтобы превратить шаблон AssemblyInfo.wcrev
в AssemblyInfo.cs
. Соответствующая строка в шаблоне может выглядеть примерно так:
[assembly: AssemblyVersion("2.3.$WCREV$.$WCMODS?1:0$$WCUNVER?1:0$")]
Третий элемент - это номер ревизии. Я использую четвертый элемент для проверки, что я не забыл совершать какие-либо новые или измененные файлы (четвертый элемент - 00, если все в порядке).
Кстати, добавьте AssemblyInfo.wcrev
в ваш контроль версий и игнорировать AssemblyInfo.cs
, если вы используете это.