title: VS 2017 does not perform the fast up-to-date check if shared bin directory is used for local builds
body: <p>We want to use the shared bin directory for local development builds similarly to how it is used on the CI server. This way a fully built branch of our application occupies less than one third of the space. Which means more branches can fit on our small SSDs.</p>
  
  <p>So, we did that and it all works fine, except VS 2017 IDE no longer uses the fast up-to-date check heuristics.</p>
  
  <p>So, before the change when we built the code the second time the build output reported something like this:</p>
  
  <pre><code>========== Build: 0 succeeded, 0 failed, 94 up-to-date, 0 skipped ==========
  </code></pre>
  
  <p>Meaning IDE employed the heuristic, decided that all the projects are up-to-date (very fast) and skipped msbuild entirely.</p>
  
  <p>After the change, this does not happen, IDE actually hands off all the projects to msbuild, which takes about a minute to burn through all the projects. It does not actually compile any code, but the whole process takes longer now.</p>
  
  <p>It is as if we have set the <code>DisableFastUpToDateCheck</code> msbuild property, except that we have not.</p>
  
  <p>So, how do we troubleshoot it? I want the heuristic back.</p>
  
  <p><strong>EDIT 1</strong></p>
  
  <p>I owe a few words on how we did it. Every project imports a special targets file just before importing the standard targets (like Microsoft.CSharp.targets). This was developed in the pre MSBuild 15 days, so we do not use <code>Directory.Build.targets</code>. In this file we have <code>OutDir</code> explicitly set to some shared bin directory within the workspace. So, all the projects specify <code>OutputPath</code> as usual, but it is overridden with the <code>OutDir</code> in this special targets file. I think this is the root cause for losing the heuristic - it only looks at the csproj, so it sees <code>OutputPath</code>, but not <code>OutDir</code>. And since no binaries are found at <code>OutputPath</code> the heuristic is not satisfied.</p>
  
  <p>I will test this hypethesis and if it turns out to be true will repost this comment as my answer.</p>