从外部.target文件中指定AdditionalReferencePaths

时间:2018-07-04 16:34:31

标签: c# msbuild

我有很多项目需要进行调整才能在连续的环境中构建。

我将所有调整放在一个单独的.target文件中,以便在所有项目中重复使用此文件。

在我的csproj文件的最后,我放置了Project元素(在结束之前):

除非我尝试添加其他参考路径,否则此方法效果很好。

如果我使用命令行指定路径(msbuild myproject.csproj /p:ReferencePath="C:\path\to\dlls")。项目编译。

我的目标文件是:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <!-- some tweaks here -->
    <PropertyGroup Condition="'$(CompileFor)' == 'SP2013'">
        <SomeProperty>some value</SomeProperty>
        <AdditionalReferencePaths>C:\path\to\dlls</AdditionalReferencePaths>
    </PropertyGroup>      
</Project>

但这不起作用(无法解析dll)。

我也尝试过:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
     <ItemGroup>
            <AdditionalReferencePaths Include="C:\path\to\dlls"/>            
     </ItemGroup> 
</Project>

这不起作用,因为ItemGroup元素不能超出Target元素

最后,我尝试过:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">    
    <Target Name="SomeTarget" BeforeTargets="BeforeBuild">          
        <ItemGroup>
            <AdditionalReferencePaths Include="C:\path\to\dlls"/>              
        </ItemGroup> 
    </Target>    
</Project>

这仍然不起作用。没错,我可以在构建日志中看到目标已被调用,但DLL仍然无法解析。

如何解决?

为了提供一些背景信息,我在目标文件中进行的调整允许我针对不同版本的DLL编译项目。该代码是第3方应用程序(以SharePoint命名)的插件,我想针对该产品的几种不同版本进行编译。使用某些条件,我可以将产品的一个版本指向一个文件夹,将产品的另一个版本指向另一个文件夹。

1 个答案:

答案 0 :(得分:0)

经过两次修复,我摆脱了这个问题。

  1. 正确的属性不是AdditionalReferencePath,而是ReferencePath
  2. 我还必须将Import移动到csproj的第一个ItemGroup之前。我猜想这是必须在Reference元素之前设置属性