在构建/部署或运行​​时更改SSIS脚本任务中引用的dll

时间:2017-02-03 09:52:52

标签: c# powershell ssis msbuild gac

最近,我已将所有SSIS项目添加到持续集成管道中。这些项目是使用TeamCity中的MSBuild构建的,打包并推送到nuget feed。我们使用Octopus部署它们,并在后端SQL服务器管理对象(SMO)上构建一些手动PowerShell。除一个项目外,一切正常。有问题的项目包含一些引用外部程序集的脚本任务。该程序集构建在同一管道中,其程序集版本号由部分流程更新。问题在于SSIS项目现在引用GAC中的强名称dll,因为版本号已更改,因此不存在。

是否有人知道在CI服务器上构建时更新引用或在部署时覆盖版本号的方法?

1 个答案:

答案 0 :(得分:0)

我知道这篇文章已经很老了,但是已经被浏览了很多,所以这是我找到的解决方案。

您需要为该构建包含一个“目标”文件。

以下是目标文件的示例:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <PropertyGroup>
        <E10BOs>C:\Integrations\E10 Uplifts\Epicor 10.2.600.3</E10BOs>
    </PropertyGroup>
    <Target Name="BeforeResolveReferences">
        <CreateProperty Value="$(E10BOs);$(AssemblySearchPaths)">
            <Output TaskParameter="Value" PropertyName="AssemblySearchPaths" />
        </CreateProperty>
    </Target>
</Project>

属性组E10BOS(最多可以有1个)然后定义要构建的版本的dll的路径。

它需要另存为myTargetsFile.targets

然后在常规VS项目中,您可以将此行添加到项目文件中(在记事本中VS之外)

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />

  <Import Project="$([MSBuild]::GetDirectoryNameOfFileAbove($(MSBuildThisFileDirectory), myTargetsFile.targets))\myTargetsFile.targets" />
</Project>

这将使用GetDirectoryNameOfFileAbove搜索文件夹树,直到找到目标文件,然后将其导入。如果您有许多不同的项目都需要更改版本,而不必找出任何相对路径,则非常有用!

但是在SSIS中这似乎不起作用。 什么是硬连接包.dtsx文件中目标文件的路径,然后再次在记事本中对其进行编辑并添加以下行(您可能会像以前一样在项目标签末尾看到csharp条目:

<Import Project="C:\Integrations\E10 Uplifts\Epicor 10.2.600.3\myTargetsFile.targets" />

这会将项目引用的信息传递到脚本中。

然后使用目标文件更改版本的所有项目都是通过更改要使用的版本文件夹的路径来完成的。

希望有帮助吗?