Buildalyzer icon indicating copy to clipboard operation
Buildalyzer copied to clipboard

Source files included with an absolute path ignored on Linux

Open dmirmilshteyn opened this issue 5 years ago • 2 comments

I have a project which I analyze on both Windows and Linux, and it seems like some files are being excluded/ignored from the source files collection when running the analyses on Linux. It works fine with the same inputs on Windows.

Specifically, it seems like any files that have been included in the Compile item group with an absolute path are ignored on Linux.

Example: <Compile Include="$(MSBuildThisFileDirectory)Item.cs" />

There are two cases where I need to include files like this: a custom file outside the project directory, used with many projects, and shared projects.

VS adds all items in shared projects in that style. Apart from that, shared projects seem to work fine.

I believe this is happening because the Csc command line parser treats filepaths of the form "/path/to/item.cs" as an argument instead of a file path, but I'm really not sure.

Project:

<Project Sdk="Microsoft.NET.Sdk">
  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>netcoreapp2.2</TargetFramework>
  </PropertyGroup>

  <ItemGroup>
    <Compile Include="$(MSBuildThisFileDirectory)..\test.cs" />
  </ItemGroup>
</Project>

This file path resolves to /path/to/test.cs

Code used to analyze:

AnalyzerManager manager = new AnalyzerManager();
ProjectAnalyzer analyzer = manager.GetProject(@"/path/to/project.csproj");
AnalyzerResults results = analyzer.Build();
string[] sourceFiles = results.First().SourceFiles; // test.cs not included on Linux, but is on Windows

FullExampleProject.zip

Thanks!

dmirmilshteyn avatar May 02 '19 05:05 dmirmilshteyn

I released 2.3.0 this morning and it has a rewritten command line parser. Can you give it a try and report back?

daveaglick avatar May 16 '19 22:05 daveaglick

I'm using version 5.0.0 and I have a similar problem: files with absolute paths are not reported in Linux. These files are considered as options because of their leading /: https://github.com/daveaglick/Buildalyzer/blob/main/src/Buildalyzer/AnalyzerResult.cs#L229

My workaround is to transform all Compile item paths to relative paths with this target (see https://github.com/nimbleways/dotnet-subset/blob/ede95798a/Directory.Build.targets#L7-L15):

  <!-- Workaround for https://github.com/daveaglick/Buildalyzer/issues/108 -->
  <Target Name="MakeCompileItemsRelative" BeforeTargets="CoreCompile">
    <ItemGroup>
      <CompileWithRelativePaths Include="@(Compile->'$([MSBuild]::MakeRelative('$(MSBuildProjectDirectory)', '%(Compile.Identity)'))')" />
      <Compile Remove="@(Compile)" />
      <Compile Include="@(CompileWithRelativePaths)" />
    </ItemGroup>
  </Target>

othmane-kinane-nw avatar Jul 28 '23 18:07 othmane-kinane-nw