MSBuild:如何在链接的父目录中包含一堆文件?

Jam*_* Ko 5 .net c# msbuild conditional-compilation

我正在编写一个 C# 项目,其中具有以下目录结构:

LibFoo
|
---- LibFoo.Shared
|    |
|    ---- [a bunch of .cs files]
|
---- LibFoo.Uwp
|    |
|    ---- LibFoo.Uwp.csproj
|
---- LibFoo.Wpf
     |
     ---- LibFoo.Wpf.csproj
Run Code Online (Sandbox Code Playgroud)

我很想知道,是否可以包含共享目录中的 C# 文件,以便它们显示在 Visual Studio 的解决方案资源管理器中?我知道您可以通过设置标签的Link属性来做到这一点<Compile>,但是当.cs项目中的文件数量可变时,我不太确定如何做到这一点。

澄清一下,这是我的 csproj 文件的相关部分:

<PropertyGroup>
    <!-- Compile everything in this dir -->
    <CompileRoot>..\LibFoo.Shared</CompileRoot>
</PropertyGroup>

<ItemGroup>
    <Compile Include="$(CompileRoot)\**\*.cs">
        <Link> <!--What goes here?--> </Link>
    </Compile>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

感谢您的帮助!

编辑:忘了提及,它们包含在父目录中这一事实是相关的,因为这就是它们没有出现在 Visual Studio 中的原因。如果它们出现在 VS 中,我就不必执行任何这些链接操作。

编辑2:按照shamp00的建议,我试过这个:

<ItemGroup>
    <Compile Include="$(CompileRoot)\**\*.cs">
        <Link>$([MSBuild]::MakeRelative('$(CompileRoot)', '%(FullPath)'))</Link>
    </Compile>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

不幸的是,虽然当我Message从项目中运行任务时它似乎输出正常,但链接似乎在 Visual Studio 中被忽略了。

编辑 3:对于那些有兴趣重现此问题的人,您可以从GitHub 存储库克隆源代码:

git clone git@github.com:jamesqo/typed-xaml
cd typed-xaml
Run Code Online (Sandbox Code Playgroud)

之后,您可以在 Visual Studio 中打开解决方案并自己查看效果。相关代码在文件中。

sha*_*p00 4

像这样的东西应该有效:

<Target Name="Default">
    <ItemGroup>
        <Parent Include="..\LibFoo.Shared\**\*.cs"/>
        <Compile Include="@(Parent)">
            <Link>..\LibFoo.Shared\%(Parent.Filename).cs</Link>
        </Compile>
    </ItemGroup>
    <Message Text="%(Compile.Identity) is linked to %(Compile.Link)"/>
</Target>
Run Code Online (Sandbox Code Playgroud)

编辑

根据这个答案,以下工作......

<Compile Include="..\LibFoo.Shared\**\*.cs">
  <Link>.\thisDummyFolderNameDoesNotMatter</Link>
</Content>
Run Code Online (Sandbox Code Playgroud)

编辑2

我不确定如何让它与外部common.props文件一起使用,但如果将以下内容直接添加到Typed.Xaml.Wpf.csproj ,它就可以工作。

<ItemGroup>
  <Compile Include="..\Typed.Xaml\**\*.cs">
    <Link>notimportant</Link>
  </Compile>
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)