的MSBuild,OutputPath到lib目录未兑现(MSBuild, OutputPath t

2019-10-28 13:10发布

现在我花了几个小时,但我只是不明白这一点:

为什么一个lib子目录不是由VS“快跟上时代的支票”兑现? 如果库的一个lib目录输出设置,解决方案总是重建 - 如果已经作了修改与否并不重要。 如果\ LIB目录子去掉它的工作原理。 为什么?

以下是我测试至今:

请参考下面的代码片段。 这一个完美的作品。 如果多个依赖项目被要求建立多次,他们真正建立仅适用于已进行任何更改一次。 在Visual Studio FastUpToDateCheck踢英寸

但是,如果你更改的行

<OutputPath>$(SolutionDir)bin\$(Configuration)\$(Platform)</OutputPath>

<OutputPath>$(SolutionDir)bin\$(Configuration)\$(Platform)\lib\</OutputPath>

它不断地重建。 任何想法,为什么?

ComponentBuild.props旁边.sln文件

<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
    <IntermediateOutputPath>$(SolutionDir)obj\$(Configuration)\$(MSBuildProjectName)\</IntermediateOutputPath>
    <UseCommonOutputDirectory>False</UseCommonOutputDirectory>
    <DisableFastUpToDateCheck>false</DisableFastUpToDateCheck>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(OutputType)' == 'Library' ">
    <!-- To distinguish by \lib\ does not work, a rebuild is triggered since the up-to-date check fails -->
    <!-- <OutputPath>$(SolutionDir)bin\$(Configuration)\$(Platform)\lib\</OutputPath> -->
    <OutputPath>$(SolutionDir)bin\$(Configuration)\$(Platform)</OutputPath>   
    <OutDir>$(OutputPath)</OutDir>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(OutputType)' == 'Exe' ">
    <OutputPath>$(SolutionDir)bin\$(Configuration)\$(Platform)\</OutputPath>
    <OutDir>$(OutputPath)</OutDir>
  </PropertyGroup>
</Project>

该文件包含在之前的csproj文件Import Microsoft.CSharp.targets

.csproj的文件:

    <!-- position of include is important, OutputType of project must be defined already -->
    <Import Project="$(SolutionDir)ComponentBuild.props" Condition="Exists('$(SolutionDir)ComponentBuild.props')" /> 
    <Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
    <PropertyGroup>
      <PostBuildEvent>
      </PostBuildEvent>
    </PropertyGroup>

行为变得越来越怪异,我就越测试。 我创建了两个简单的库项目A和B. B依赖于A.我上面提到的进口增加和FastUpToDateCheck工作。 添加库路径到库输出类型后,在没有其他改变它的工作原理。 但是,当LIB B类项目的清理,以后每建立DO改造项目B.

当添加库路径exe文件输出类型为好。 该FastUpToDateCheck再次工作。

然后,我删除了从输出型的exe再次库路径,但令人惊讶的FastUpToDateCheck仍然有效 - 永远。 即使在清洁时所建,更改类或删除所有OBJ和bin文件夹。

但只要我删除从LIB输出类型的lib路径为好,即我重新设置所有到原来的状态,它失败。 它重建每次。 诊断输出的第一行是

项目“ClassLibrary1的”是不是最新的。 缺少输出文件C:\用户\ hg348 \文档\ Visual Studio的2015年\项目\ BuildTest \ BIN \调试\ AnyCPU \ LIB \ ClassLibrary1.dll“

它仍然看起来到库路径,即使没有设置任何更多。 我认为这是涉及一些讨厌的缓存。

是否有人可以验证这一点?

Answer 1:

那么,上述导致所描述的回答我的测试:这是在Visual Studio(VS)缓存触发改变输出路径后的版本。 在更改outputpath,可能OUTDIR以及之后,Visual Studio中看起来仍然在旧目录的FastUpToDateCheck。

关闭并重新打开该解决方案帮助已经清除VS缓存。 在某些情况下,有必要删除隐藏文件.suo隐藏文件夹中.vs这解决了上述问题给出的示例文件规定的所有问题。

我最终导入文件看起来是这样的:

<?xml version="1.0" encoding="utf-8"?>
  <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

      <!--  Note that VS caches settings, to be sure the FastUpToDateCheck works
                * reopen the solution after 
                    - changing properties
                    - after adding a platform config
                    - after adding references to projects
                * close VS and remove the hidden file 
                  <solution folder>\.vs\<solution name>\v14\.suo   after changing IntermediateOutputPath,
                  (You have to enable "how hidden files" in windows file explorer)
                * After updating App.config do a random change in any .cs source file too, 
                  otherwise FastUpToDateCheck fails
      -->

      <PropertyGroup>
        <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>

        <IntermediateOutputPath>$(SolutionDir)obj\$(Configuration)\$(Platform)\$(MSBuildProjectName)\</IntermediateOutputPath>

        <!-- if true, don't copy output files of referenced assemblies, since everything builds to the same folder. -->
        <UseCommonOutputDirectory>true</UseCommonOutputDirectory>
        <DisableFastUpToDateCheck>false</DisableFastUpToDateCheck>
      </PropertyGroup>

      <PropertyGroup Condition=" '$(OutputType)' == 'Library' ">

        <OutputPath>$(SolutionDir)bin\$(Configuration)\$(Platform)\lib\</OutputPath>
        <OutDir>$(OutputPath)</OutDir>
      </PropertyGroup>

      <PropertyGroup Condition=" '$(OutputType)' == 'Exe' ">
        <OutputPath>$(SolutionDir)bin\$(Configuration)\$(Platform)\</OutputPath>
        <OutDir>$(OutputPath)</OutDir>
      </PropertyGroup>


      <!-- sets "Copy Local" property of references to false on reopen of solution
           don't copy output files of referenced assemblies, since everything builds to the same folder -->
      <ItemDefinitionGroup>
        <Reference>
            <Private>False</Private>
        </Reference>
        <ProjectReference>
            <Private>False</Private>
        </ProjectReference>
      </ItemDefinitionGroup>

  </Project>


文章来源: MSBuild, OutputPath to a lib directory is not honoured
标签: msbuild