引用单独的子文件夹

时间:2014-06-20 21:57:27

标签: c# visual-studio msbuild

我花了几天时间,最后找到了一个似乎有用的解决方案。然而,它似乎有点脆弱或者可能是不明智的。

我希望所有非系统引用的程序集(当前使用的项目库都是NuGet管理的)包含在构建输出的“libs”子文件夹中。

我的csproj文件底部包含以下代码片段(通过谷歌搜索和我在这里找到的几个问题构建。)

  <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
  <!-- To modify your build process, add your task inside one of the targets below and uncomment it. 
       Other similar extension points exist, see Microsoft.Common.targets. -->
  <Target Name="BeforeBuild">
    <Message Text="### Removing existing 'lib' folder" Importance="high" />
    <RemoveDir Directories="$(TargetDir)libs" />
  </Target>
  <Target Name="MoveLibrariesOnBuild" AfterTargets="Build">
    <ItemGroup>
        <Libraries Include="%(Reference.HintPath)" >
           <MissingHintPath>$([MSBuild]::ValueOrDefault('%(Reference.HintPath)', '').Equals(''))</MissingHintPath>         
        </Libraries>
    </ItemGroup>
    <Message Text="### Moving libraries to 'libs' ###" Importance="high" />
    <Copy SourceFiles="@(Libraries)" 
            DestinationFiles="$(TargetDir)libs\%(Filename).dll" 
            Condition="%(Libraries.MissingHintPath) == False" 
            SkipUnchangedFiles="false" 
            OverwriteReadOnlyFiles="true" />
  </Target>
</Project>

我尝试使用Reference.Identity和Reference.Filename,但Filename也包含版本,文化等信息(因此它不会被正确重命名,除非我尝试使用内联字符串替换。)

你的想法?有没有更简单的方法,我是不是在想这个?

我根据引用构建了一个列表,并使用HintPath(仅适用于非标准程序集)作为我应该包含的标志。然后,在我的MoveLibrariesOnBuild目标中,MissingHintPath被用作条件标志。

根据我发现的建议,我避免使用CopyLocal(为引用生成True属性)。例如,What is the best practice for "Copy Local" and with project references?

我看到其他人提出类似的问题,但似乎没有人回答或完成。或许,通过社区的一些批评,这可以成为一种有用的资源。

PS:我还尝试使用xcopy和robocopy来使用项目构建事件,但事实证明这些事件的可靠性更低(并且难以调试)。

此外,这依赖于设置探测路径,如C#: Custom assembly directory

所述

PPS:如果在删除/覆盖文件时遇到“文件正在使用”问题,则可能需要取消选中“启用Visual Studio托管过程”,如上所述here < / p>

1 个答案:

答案 0 :(得分:0)

这是一个古老的问题,但是在MSBuild的某个地方引入了一个似乎未公开的“ DestinationSubDirectory”元数据选项以供项目引用。我只知道这一点,因为我花了很多时间来挑选Microsoft.Common.targets本身以了解其工作原理。

使用方式

  <ItemGroup>
    <ProjectReference Include="..\Utilities\Company.Project.Utilities.csproj">
      <Project>{ea7de0b6-aaba-42e7-97ae-bb33877db2a4}</Project>
      <Name>Company.Project.Utilities</Name>
      <DestinationSubDirectory>libs\</DestinationSubDirectory>
    </ProjectReference>
  </ItemGroup>

您的dll将被复制到项目输出目录中的“ libs”子文件夹中。