Dynamics CRM 插件和 VSTS 构建

Dynamics CRM Plugin and VSTS Build

这是我的场景:我们使用 Dynamics CRM Online 2015 Update 1。为此,我们必须开发一些插件。我使用最新版本的 CRM SDK (v8.0.0)。而我们使用Visual Studio团队服务+Visual Studio2015企业版。

我的插件有一些依赖性,例如 Newtonsoft.Json。

我发现为了能够部署我的插件,我必须使用 ILMerge,以便 Newtonsoft.Json 合并到我的插件 DLL 中,并且一旦部署就可以被它使用。该方法在此处描述:http://nicknow.net/dynamics-crm-ilmerge-dll-plugin/ 到目前为止,一切正常!

此方法的缺点是程序集 Microsoft.Crm.Sdk.Prox、Microsoft.Xrm.Sdk 和 Microsoft.IdentityModel 不能包含在合并的程序集中。为此,我必须将他们的 属性 "Copy local" 设置为 False。

插件部署很好。但是当我签入我的插件时,VSTS 的构建失败了,因为它无法找到将 Copy local 设置为 False 的 3 个程序集。

所以我的问题是,您认为处理此问题的最佳方法是什么?例如,是否可以在将 Copy local 设置为 True 的构建之前添加脚本?如何?或者,如果您能想到任何其他想法,请随意:)

当使用 Ilmerge 作为命令行时,您可以选择要包含哪些 dll。在我的项目中,我通常:

  • 为 IlMege 安装 NuGet 包
  • 添加 post 构建事件调用 ilmerge.exe 并仅包含我在最终 dll 中需要的库
  • 不要使用 Microsoft v8 CRM 组件;这些是 Dynamics CRM 2016 的一部分。对于 CRM 2015,您需要 v7.

  • 将 NuGet 包 Microsoft.CrmSdk.CoreAssemblies 添加到您的插件项目;它有助于避免构建问题。

  • 将 NuGet 包 ILMerge 添加到解决方案中。它安装在默认位置。

  • 将批处理脚本添加到您的 运行 项目作为 post 构建步骤。您的脚本应包含类似于此的合并步骤:"%SOLUTIONDIR%packages\ILMerge.2.14.1208\tools\ILMerge" /log:ILMerge.log /keyfile:"%KEYFILE%" /targetplatform:v4,"%PLATFORMDIR%" /out:tmp_merge\%PROJECTBINARY%.dll %PROJECTBINARY%.dll Newtonsoft.Json.dll

VSTS 构建不应在引用上失败。我有一个使用 ILMerge.Task 的类似结构的构建定义,它运行得很好。最好的做法是按照以下步骤操作:

  • 确保您的项目中没有任何硬引用。确保通过 Nuget 检索 Microsoft.CrmSdk.CoreAssemblies 包。这可能是您的构建服务器出现问题的原因。
  • 使用 Install-Package MSBuild 获取 ILMerge.Task 包。ILMerge.Task
  • 为每个必须合并到 'true' 的引用 (DLL) 设置 'Copy local' 属性值。确保将其他引用的 'Copy local' 值设置为 false。
  • 确保使用项目中包含的 ILMergeOrder.txt 文件以正确的顺序合并引用的程序集。

名为 'ILMerge.props' 的文件将添加到您的项目中。您应该在此文件中设置两个属性:

<ILMergeAllowMultipleAssemblyLevelAttributes>true</ILMergeAllowMultipleAssemblyLevelAttributes>
<ILMergeCopyAttributes>true</ILMergeCopyAttributes>

这些属性确保正确处理不同程序集中的重复属性。