在旧版本的 csproj 格式也就是 Franken-proj 格式,可以使用 SolutionDir 拿到当前sln文件所在的文件夹,但是在 SDK Style 格式的项目文件,是拿不到这个属性的,本文告诉大家如何做到兼容之前的逻辑
其实不是 SDK Style 拿不到 SolutionDir 属性,而是因为没有使用 sln 加入构建
如我在一个项目里面的 csproj 文件添加下面代码
<Target Name="KofegaheqallwhikaDalbedalkihi" AfterTargets="BeforeBuild">
<Warning Text="Solution $(SolutionDir)"/>
</Target>
如果我使用 dotnet 命令构建这个 csproj 文件,那么将会输出如下代码
warning : Solution *Undefined*
如果我使用 dotnet 命令构建 sln 文件,那么可以输出 sln 所在的文件夹
这就是不同点
但是如果我只是想通过 dotnet 或 msbuild 命令构建 csproj 文件,而不构建 sln 文件,此时还需要使用 SolutionDir 属性。那么请在 sln 文件夹添加一个叫 Directory.Build.props 文件,这个文件可以设置这个文件夹里面的所有项目的构建
而 $(SolutionDir)
属性的含义也就是一个属性,因此只需要返回当前 sln 所在文件夹就可以
<Project>
<PropertyGroup>
<SolutionDir>$(MSBuildThisFileDirectory)</PackageOutputPath>
</PropertyGroup>
</Project>
上面代码的 $(MSBuildThisFileDirectory)
就是获取当前文件所在的文件夹,而当前文件是放在和 sln 文件相同的文件夹,因此这个就是和 SolutionDir 等价
如果小伙伴不知道 Directory.Build.props 文件可以如何写,还请小伙伴看我的 github 仓库
关于 Directory.Build.props 文件 的作用请看 Roslyn 使用 Directory.Build.props 文件定义编译
关于 MSBuildThisFileDirectory
等默认变量请看 项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv
更多编译相关博客请看 手把手教你写 Roslyn 修改编译
本文会经常更新,请阅读原文: https://dotnet-campus.github.io//post/Roslyn-%E8%A7%A3%E5%86%B3%E6%89%BE%E4%B8%8D%E5%88%B0-SolutionDir-%E5%B1%9E%E6%80%A7.html ,以避免陈旧错误知识的误导,同时有更好的阅读体验。
本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。欢迎转载、使用、重新发布,但务必保留文章署名 lindexi (包含链接: https://dotnet-campus.github.io/ ),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请 与我联系 。