19

我已经“继承”了一个新的(旧的?)Winforms 项目,并希望将它放到我们的构建服务器(Bamboo)上。该构建服务器仅安装了绝对最低版本(.NET 3.5,仅此而已),我们希望保持这种状态。

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

但是当我尝试在 Bamboo 上运行这个构建(使用 MSBuild)时,我不断收到错误:

Properties\licenses.licx(1):错误 LC0004:创建类型“Infragistics.Win.UltraWinToolbars.UltraToolbarsManager、Infragistics2.Win.UltraWinToolbars.v7.2、版本=7.2.20072.61、文化=中性、PublicKeyToken=7dd5c3163f2cd0cb”系统时发生异常.ComponentModel.LicenseException

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

但是我怎样才能摆脱这些,以便我的构建服务器构建能够正常工作,而无需将完整的 Infragistics 组件集安装到构建服务器上(这不是一个选项)?

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

嗯....经典的catch-22 - 有什么办法吗?

4

5 回答 5

28

我发现解决这个问题的唯一方法是:

  • licenses.licx在解决方案所在的文件夹中创建一个绝对空(0 字节长度)的文件
  • 在构建的初始阶段,源是从我的源存储库中提取的
  • 时机成熟时,就在构建开始之前,我将这个空白复制到各个项目目录中的licenses.licx所有现有目录中licenses.licxProperties

有了这个,现在我的交互体验都在工作(因为存在正确的licenses.licx文件),但我的自动构建也没有中断(因为licenses.licx我复制所有真实文件的空文件不会导致构建中止)

似乎有点hackish - 但它有效。希望有一天能对某人有所帮助。

更新:我将此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>任务来实现我的目标。

于 2010-01-19T09:31:50.157 回答
4

我们有来自其他公司的组件,但如果在第三方库中使用.Net 许可模型,该方法应该可以工作。

如果您有licenses.licx文件,则库可能使用.Net 许可模型。在构建过程中,它使用lc.exe实用程序构建二进制许可证文件,然后将其作为嵌入式资源包含在程序集中。

你需要做什么:

  1. YourApp.exe.licenses使用 lc.exe生成文件。另一种方法是构建包含licenses.licx并从obj\Debugobj\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. 构建 - 检查 - 提交。

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

于 2015-07-06T22:32:55.730 回答
1

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

于 2017-10-20T14:42:39.013 回答
0

我可以根据marc_s的回答构建 Team City 项目,即用空白 licenses.licx 替换现有的许可证文件。

但是当我尝试在本地机器上打开具有基础设施控制的 aspx 页面时,出现了另一个问题,它给出了错误,因为我在本地机器上安装了基础设施,但我的 licenses.licx 是空白的。

我找到了一个解决方法,如下所示:

  • 在 Visual Studio 中创建了一个新配置,专门用于在 Team City 中构建项目

在此处输入图像描述

<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”目标,它将许可证文件替换为空白文件并构建成功。

  • 在我的本地机器上,我继续使用“调试”或“发布”版本,因为它不会用空白文件替换 licenses.licx 文件。所有基础设施控件都出现在 .aspx 页面上,没有任何问题。

于 2016-07-29T05:13:51.920 回答
0

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

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

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

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

于 2016-08-24T19:51:26.063 回答