.net 从dotnet建置中排除sln中的项目

rqqzpn5f  于 2022-11-26  发布在  .NET
关注(0)|答案(1)|浏览(230)

我有一个基于微软默认模板的roslyn分析器项目。我可以很容易地在Visual Studio或msbuild中构建分析器。
问题是解决方案中包含一个vsix项目,它依赖于dotnet build不支持的microsoft.vssdk.buildtools。这会导致在命令行中使用dotnet build构建解决方案时出现错误消息:microsoft.vssdk.buildtools\17.4.2119\tools\VSSDK\Microsoft.VsSDK.targets(826,5): error : VSIX deployment is not supported with 'dotnet build'
在使用Visual Studio进行开发时,vsix是一个不错的工具,但是我确实通过NuGet包而不是vsix发布了我的分析器,所以我不需要CLI上的vsix。
有没有办法在csproj中指定,当从dotnet build调用它时,我不希望它被构建?如果可能的话,我希望避免使用单独的sln文件或特定的dotnet配置来排除项目。

luaexgnf

luaexgnf1#

两种可能的方法包括使用解决方案筛选器和将项目更改为在某些条件下不生成。

使用解决方案筛选器

dotnet build将接受解决方案筛选器文件(.slnf)。
要创建解决方案筛选器:
1.在Visual Studio中打开解决方案
1.移至方案总管 windows
1.右键单击VSIX项目,选择“卸载项目”
1.右击解决方案,选择“另保存为解决方案筛选器”
使用dotnet建置时,必须使用.slnf。使用.sln档案或VSIX项目档搭配dotnet将会发生错误。

检测何时从dotnet build调用

MSBuild中没有已定义的属性或函数来标识运行MSBuild引擎的可执行文件。
但是,有一个MSBuildRuntimeType属性。
在MSBuild 15之前,MSBuildRuntimeType是未定义的。在MSBuild 15和更新版本中,MSBuildRuntimeType的值为FullCoreMono。根据documentation,当使用dotnet build时,MSBuildRuntimeType将具有Core的值。(此外,仅当'$(MSBuildRuntimeType)' == 'Core'时,才会显示错误消息“VSIX部署不支持”dotnet build“”。)
没有“退出生成”任务,因此项目无法检测并结束。我们需要在项目真正开始之前进行检测。但是在项目中 Package 项目是很笨拙的,特别是如果您希望能够从Visual Studio IDE中使用项目并更改属性。
可以重新定义目标,并且Import可以具有条件。当MSBuildRuntimeTypeCore时,可以导入文件,并且该文件可以重新定义'Build'目标。
添加到VSIX项目文件:

<Import Project="noop.targets" Condition="'$(MSBuildRuntimeType)' == 'Core'" />

noop.目标可能包含以下内容:

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
    <Target Name="Build">
        <Message Text="$(MSBuildProjectName) has been skipped." />
    </Target>
</Project>

希望这能有所帮助,或者至少提供一些想法。

相关问题