我可以在 csproj 中为本地和 TFS 构建使用不同的 DLL 参考吗?

Can I use different reference for DLL in csproj for local and TFS build?

有没有办法在 .csproj 文件中指定,当我的项目在本地构建时和在 TFS 上构建时对 DLL 使用不同的引用?

我想在更多解决方案之间共享一些 DLL(不想将 DLL 复制到每个解决方案的 lib 目录)。

我本地的源码结构如下

.\TfsProject
    .\lib
        MyShared.Dll
    .\Solution1
        .\Project1
        .\Project2
    .\Solution2
        .\Project1
        .\Project2

所有项目共享 MyShared.Dll

的相对路径
<HintPath>..\..\lib\MyShared.Dll</HintPath>

我的问题出现在 TFS 构建服务器上,其中源结构与本地不同。

我尝试更新 .csproj 文件以使用条件语句,在引用 MyShared.Dll 时使用不同的 HintPath 本地和 TFS 构建服务器。我的情况如下

<Choose>
  <!-- Local HintPath -->
  <When Condition="'$(SourceDir)' == ''">
    <ItemGroup>
      <Reference ...>
        <HintPath>..\..\lib\MyShared.Dll</HintPath>
      </Reference>
    </ItemGroup>
  </When>
  <!-- TFS Specific HintPath -->
  <Otherwise>
    <ItemGroup>
      <Reference ...>
        <HintPath>$(SourceDir)\..\_build\lib\MyShared.Dll</HintPath>
      </Reference>
    </ItemGroup>
  </Otherwise>
</Choose>

本地构建通过,但我在 TFS 构建时遇到 The type or namespace name could not be found 错误,因为它找不到 MyShared.Dll

知道如何解决这个问题吗?谢谢!

我会为 TFS 构建配置工作区映射以匹配您本地的内容,这样相对路径就可以在构建服务器上正确解析。

通过指定 $(MSBuildProjectDirectory) 并调整 HintPath 而不是 $(SourceDir) 解决了我的问题。似乎 $(SourceDir) 未被构建服务器识别为 .csproj 中的有效变量。

可用构建变量列表:

https://msdn.microsoft.com/en-us/library/ms164309(v=vs.120).aspx

这个问题也有帮助:

List of MSBuild built-in variables