Компоненты инфраструктуры на сервере сборки - PullRequest
17 голосов
/ 15 января 2010

Я «унаследовал» новый (старый?) Проект Winforms и хотел бы поместить его на наш сервер сборки (Bamboo). На этом сервере сборки установлен только абсолютный минимум (.NET 3.5 и не намного), и мы бы хотели сохранить его таким.

В качестве первого шага я извлек все файлы сборки (* .dll) для компонентов Infragistics в отдельный каталог и ссылался на них из этого локального каталога (вместо того, чтобы полагаться на их установку в GAC). Работает нормально.

Но когда я пытаюсь запустить эту сборку на Bamboo (используя MSBuild), я получаю ошибки:

Свойства \ licenses.licx (1): ошибка LC0004: возникла исключительная ситуация при создании тип «Infragistics.Win.UltraWinToolbars.UltraToolbarsManager, Infragistics2.Win.UltraWinToolbars.v7.2, Версия = 7.2.20072.61, Культура = нейтральная, PublicKeyToken = 7dd5c3163f2cd0cb» System.ComponentModel.LicenseException

После небольшого поиска в Google кажется, что эти licenses.licx файлы в проектах представляют собой какую-то схему лицензирования, предотвращающую установку инструментов на нескольких компьютерах.

Но как я могу избавиться от них, чтобы моя сборка сервера работала, без установки полного набора компонентов Infragistics на сервер сборки (это вариант НЕ ) ??

  • если я просто удаляю их из проектов, сборка может работать (еще не пробовал), но тогда мой опыт разработки будет страдать / не работать (что из двух?)
  • наличие файлов, так что мой опыт разработки не позволяет запустить автоматическую сборку ....

Хммм .... классическая ловушка-22 - есть выход из этого ??

Ответы [ 5 ]

24 голосов
/ 19 января 2010

Единственный способ, который я нашел, чтобы решить эту проблему, это:

  • создайте абсолютно пустой (длиной 0 байт) файл licenses.licx в моей папке, где находится решение
  • на начальных этапах сборки источник извлекается из моего репозитория
  • когда придет время, непосредственно перед началом сборки, я скопирую этот пустой licenses.licx во все существующие licenses.licx в каталоге Properties различных проектов

Теперь у меня есть интерактивный опыт (поскольку присутствуют соответствующие файлы licenses.licx), но моя автоматическая сборка также не нарушается (поскольку этот пустой файл licenses.licx я скопировал поверх всех реальных файлов). не вызывает прерываний в сборке)

Кажется немного хакерским - но это работает. Надеюсь, это поможет кому-нибудь, где-нибудь, когда-нибудь.

Обновление: Я добавил этот шаг BeforeBuild в свой файл сборки MSBuild, чтобы скопировать пустой файл *.licx в нужные мне места:

<Target Name="BeforeBuild">
   <CreateItem Include="licenses.licx">
       <Output TaskParameter="Include" ItemName="EmptyLicensesLicx" />
   </CreateItem>

   <Copy SourceFiles="@(EmptyLicensesLicx)" 
         DestinationFolder="(your-target-folder-here)" 
         ContinueOnError="true" />

</Target>

Поскольку мне нужно заменить этот файл * .licx в нескольких местах, у меня фактически есть несколько таких <Copy> задач для достижения моей цели.

3 голосов
/ 07 июля 2015

У нас есть компоненты от другой компании, но подход должен работать, если Модель лицензирования .Net используется в сторонней библиотеке.

Если у вас есть файл licenses.licx, то, вероятно, библиотека использует модель лицензирования .Net . В процессе сборки он использует утилиту lc.exe для создания файла двоичных лицензий, а затем включается в сборку как встроенный ресурс.

Что нужно сделать:

  1. Создание файла YourApp.exe.licenses с использованием lc.exe. Другой способ - построить решение, содержащее licenses.licx и получить его из каталога obj\Debug или obj\Release. Этот шаг должен быть сделан на машине, где компоненты установлены и зарегистрированы. Также может потребоваться ввести лицензионный код, как в нашем случае.
  2. Исключить licenses.licx из проекта.
  3. Добавить YourApp.exe.licenses к проекту в качестве встроенного ресурса.
  4. Откройте .csproj своего приложения и отредактируйте запись для файла YourApp.exe.licenses. У вас будет что-то вроде этого <EmbeddedResource Include="YourApp.exe.licenses" /> Это должно быть изменено на

    <EmbeddedResource Include="YourApp.exe.licenses" >
          <LogicalName>YourApp.exe.licenses</LogicalName>
    </EmbeddedResource>
    

    Это необходимо для исключения пространства имен из имени ресурса.

  5. Build - Check - Commit.

Я не уверен, как работает lc.exe, но вам, вероятно, придется время от времени перестраивать файл YourApp.exe.licenses.

0 голосов
/ 20 октября 2017

Чтобы дополнить ответы выше (т.е. решить проблему путем создания пустого файла licenses.licx), вы можете установить пакет EmptyLicensesLicx nuget, и он создаст пустой Licenses.licx в вашем проекте прежде чем он будет скомпилирован каждый раз (это все, что вам нужно для его работы).

0 голосов
/ 24 августа 2016

Я недавно столкнулся с этой проблемой, используя TeamCity 9.1 в качестве сервера сборки.

Когда мы изначально настраивали сервер сборки, мы не хотели устанавливать Infragistics на машине, поэтому мы создали папку References, куда скопировали необходимые сборки и отметили их. работать вокруг.)

Убедитесь, что проекты ссылаются на сборки по новому пути. Это создает запись HintPath в файлах проекта для каждой сборки.

Наконец, отредактируйте файл проекта вручную, чтобы добавить True для каждой ссылки. (Недостаточно установить для свойства Copy Local значение true.)

0 голосов
/ 29 июля 2016

Я мог бы построить проект Team City на основе ответа marc_s , т. Е. Заменив существующий файл лицензии пустым licenses.licx.

Но при попытке открыть страницы aspx с элементами управления инфраструктурой на локальном компьютере произошла другая ошибка: выдается ошибка, поскольку на локальном компьютере установлена ​​инфраструктура, но мой licenses.licx пуст.

Я нашел обходной путь для этого, как показано ниже:

  • Создана новая конфигурация в Visual Studio специально для создания проектов в Team City

enter image description here

<Target Name="BeforeBuild" Condition="$(Configuration)==CI_TeamCity_Build">
    <CreateItem Include="$(MSBuildProjectDirectory)\licenses.licx">
      <Output TaskParameter="Include" ItemName="EmptyLicensesLicx" />
    </CreateItem>
    <Copy SourceFiles="@(EmptyLicensesLicx)" DestinationFolder="$(MSBuildProjectDirectory)\Properties\" ContinueOnError="true" />
</Target>
  • Добавлена ​​цель 'BeforeBuild', как упомянуто marc_s. Кроме того, я добавил условие, что эта задача будет выполняться, когда моя сборка использует 'CI_TeamCity_Build', а не для 'Debug'или 'Release' build

  • Конфигурация сборки Team City использует вышеуказанную конфигурацию в шаге "VS Solution Build Runner".Из-за цели «BeforeBuild» в файле csproj он заменяет файл лицензии на пустой и сборка завершается успешно.

  • На моей локальной машине я продолжаю использовать сборку «Debug» или «Release», так как онане заменит файл licenses.licx пустым.Все элементы управления инфраструктурой отображаются на странице .aspx без каких-либо проблем.

...