构建服务器上的Infragistics组件

19

我继承了一个新的(旧的?)Winforms项目,并希望将其放在我们的构建服务器(Bamboo)上。该构建服务器仅安装了最少量的内容(.NET 3.5等),我们希望保持这种方式。

作为第一步,我将所有Infragistics组件的程序集文件(*.dll)提取到单独的目录中,并从该本地目录引用它们(而不是依赖于它们安装在GAC中)。 这样可以正常工作。

但是当我尝试在Bamboo上运行此构建(使用MSBuild)时,我始终会收到错误:

Properties\licenses.licx(1): error LC0004: Exception occurred creating type 'Infragistics.Win.UltraWinToolbars.UltraToolbarsManager, Infragistics2.Win.UltraWinToolbars.v7.2, Version=7.2.20072.61, Culture=neutral, PublicKeyToken=7dd5c3163f2cd0cb' System.ComponentModel.LicenseException

经过一番搜索,似乎项目中的那些licenses.licx文件是某种许可证方案,以防止工具被安装在多台机器上。

但是如何摆脱它们,以使我的构建服务器构建工作正常,而无需在构建服务器上安装完整的Infragistics组件集(这不是一个选项)??

  • 如果我只是从项目中删除它们,构建可能会工作(还没有尝试过),但我的设计时间体验会受到影响 / 不起作用(两者中的哪一个?)
  • 保留这些文件以使我的设计时间体验正常运行将阻止自动构建的运行....

Hmmm....经典的进退维谷 - 有任何出路吗?

5个回答

29
我发现解决这个问题的唯一方法是:
  • 在我的解决方案所在的文件夹中创建一个完全空的(0字节长度)licenses.licx文件。
  • 在构建的初始阶段,从我的源代码库中提取源码。
  • 在构建开始之前,在各个项目的Properties目录中复制此空的licenses.licx文件覆盖所有现有的licenses.licx文件。
这样,我现在既可以使用互动体验(因为适当的licenses.licx文件已经存在),同时我的自动构建也不会中断(因为我复制到所有实际licenses.licx文件上的空的licenses.licx文件不会导致构建中止)。
看起来有点hackish,但它起作用。希望这对某个人在某个地方的某一天有所帮助。 更新: 我在我的MSBuild构建文件中添加了此BeforeBuild步骤,以将空的*.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> 任务来达到我的目标。


我和你一样。你能解释一下如何将空的licenses.licx文件复制到所有相关位置吗? - Philip Wallace
2
@Philip Wallace:我更新了我的帖子,详细展示了我是如何做到的 - 希望这能帮到你! - marc_s

4
我们有来自其他公司的组件,但如果第三方库使用.Net许可模型,则该方法应该有效。
如果您有licenses.licx文件,则库可能使用.Net许可模型。在构建过程中,它使用lc.exe实用程序构建二进制许可文件,然后将其作为嵌入式资源包含在程序集中。
你需要做的是:
  1. Generate YourApp.exe.licenses file using lc.exe. Other way is to build the solution that contains licenses.licx and get it from obj\Debug or obj\Release directory. This step should be done on machine where the components are installed and registered. Also it may require to enter license code as in our case.
  2. Exclude licenses.licx from project.
  3. Add YourApp.exe.licenses to project as embedded resource.
  4. Open .csproj of your application and edit the entry for YourApp.exe.licenses file. You will have something like this <EmbeddedResource Include="YourApp.exe.licenses" /> It should be changed to

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

    This is needed to exclude namespace from resource's name.

  5. Build - Check - Commit.

我不确定lc.exe的工作原理,但是您可能需要不时重新构建YourApp.exe.licenses文件。


1
为了补充以上答案(即通过创建一个空的licenses.licx文件解决问题),您可以安装EmptyLicensesLicx nuget包,它会在每次编译之前在您的项目中生成一个空的Licenses.licx文件(这是所有需要的)。

0

我可以根据marc_s的答案来构建基于Team City项目,即通过将现有许可证文件替换为空白licenses.licx。

但是当我尝试在本地计算机上打开具有infragistics控件的aspx页面时,出现了另一个问题,它会显示错误,因为我在本地计算机上安装了infragistics,但我的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>
  • 根据marc_s的建议,添加了“BeforeBuild”目标。此外,我还添加了一个条件,即当我的构建使用“CI_TeamCity_Build”而不是“Debug”或“Release”构建时,将执行此任务。

  • Team City构建配置在“VS Solution Build Runner”步骤中使用上述配置。由于csproj文件中的“BeforeBuild”目标,它会用空白文件替换许可证文件,从而使构建成功。

  • 在我的本地机器上,我继续使用“Debug”或“Release”构建,因为它不会用空白文件替换licenses.licx文件。所有infragistics控件都出现在.aspx页面上,没有任何问题。


0

最近在使用TeamCity 9.1作为我的构建服务器时遇到了这个问题。

当我们最初设置构建服务器时,我们不想在机器上安装Infragistics,因此我们创建了一个References文件夹,在其中复制所需的程序集并进行检查。 (我知道这是不可取的,但这是一种解决方法。)

确保项目引用新路径下的程序集。这将为每个程序集在项目文件中创建HintPath条目。

最后,手动编辑项目文件以添加<Private>True</Private>到每个引用。 (将Copy Local属性设置为true是不够的。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接