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