将语法检查(Intellisens、Resharper 等)添加到 .cs 文件而不编译它们
Add syntactic checking (Intellisens, Resharper, etc) to .cs file without compiling them
我有一堆 .cs
文件,代表使用 Roslyn API 进行某些操作的测试用例。由于它们应该具有有效的编译时语法,我希望在写入这些文件时对这些文件进行 Intellisense、Resharper 和其他预编译时间检查,但在构建解决方案时不实际编译它们(自测试以来只会查看语法)。
现在,我可能只为这些输入测试文件创建另一个项目(并确保它永远不会编译),但我宁愿将它们保留在测试项目中(我认为它们属于这个项目,为了简单起见)。我真的不在乎这些文件是否最终没有真正包含在解决方案中,只要我能在最后进行语法检查(尽管这似乎不太可能)。
起初,我以为我可以简单地排除目录在 .csproj
中的编译,但我发现没有这样的 属性 允许这样做。我听说 <CompileDependsOn>
可能会在这里帮助我,但我不明白具体如何。
我的直接问题是:是否可以对在构建 project/solution 时最终不会被编译的文件进行语法检查(Intellisense、Resharper 等),而无需将它们放在单独的、非建筑项目 ?
它与这个 类似,只是不是将构建操作更改为 "Embedded resource",而是将其更改为 "None"。不是 100% 确定这一点,因为当我尝试它时 - 它确实从编译中排除了文件,但所有文本都改变了颜色,但智能感知似乎仍然存在。所有 resharper 选项似乎仍然存在。
我至少可以想到几个可能的解决方案。
一个解决方案可能是使用预处理器定义。如果指令干扰您的测试,此解决方案可能无法令人满意,但如果您想尝试一下,您的 .cs 文件可能如下所示:
#if TESTFILE
namespace ClassesNotToCompile
{
public class IndividualClassNotToCompile
{
...
}
}
#endif
然后您需要在项目的构建配置中定义符号 TESTFILE
。然后,不要使用该构建配置。不过,您可能必须 select IDE 中的配置才能获得语法高亮显示。
另一种方法是编辑 .csproj
文件,正如您所建议的那样。假设 .NET 3.5 或更高版本,有一个名为 Remove
的项目属性,可以在 ItemGroup
位于 Target
内时使用。您可以在 BeforeBuild
目标中使用此属性从 Compile
项目中删除文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<ItemGroup>
<Compile Include="CompileMe.cs" />
<Compile Include="NonCompiling\DoNotCompileMe.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
...
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="BeforeBuild">
<ItemGroup>
<Compile Remove="NonCompiling\*" />
<Content Include="NonCompiling\*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Target>
...
</Project>
您的 BeforeBuild
目标定义出现在 Microsoft.CSharp.targets
的 Import
之后很重要。否则,您的自定义 BeforeBuild
目标将不会覆盖导入的默认空 BeforeBuild
目标。
我有一堆 .cs
文件,代表使用 Roslyn API 进行某些操作的测试用例。由于它们应该具有有效的编译时语法,我希望在写入这些文件时对这些文件进行 Intellisense、Resharper 和其他预编译时间检查,但在构建解决方案时不实际编译它们(自测试以来只会查看语法)。
现在,我可能只为这些输入测试文件创建另一个项目(并确保它永远不会编译),但我宁愿将它们保留在测试项目中(我认为它们属于这个项目,为了简单起见)。我真的不在乎这些文件是否最终没有真正包含在解决方案中,只要我能在最后进行语法检查(尽管这似乎不太可能)。
起初,我以为我可以简单地排除目录在 .csproj
中的编译,但我发现没有这样的 属性 允许这样做。我听说 <CompileDependsOn>
可能会在这里帮助我,但我不明白具体如何。
我的直接问题是:是否可以对在构建 project/solution 时最终不会被编译的文件进行语法检查(Intellisense、Resharper 等),而无需将它们放在单独的、非建筑项目 ?
它与这个 类似,只是不是将构建操作更改为 "Embedded resource",而是将其更改为 "None"。不是 100% 确定这一点,因为当我尝试它时 - 它确实从编译中排除了文件,但所有文本都改变了颜色,但智能感知似乎仍然存在。所有 resharper 选项似乎仍然存在。
我至少可以想到几个可能的解决方案。
一个解决方案可能是使用预处理器定义。如果指令干扰您的测试,此解决方案可能无法令人满意,但如果您想尝试一下,您的 .cs 文件可能如下所示:
#if TESTFILE
namespace ClassesNotToCompile
{
public class IndividualClassNotToCompile
{
...
}
}
#endif
然后您需要在项目的构建配置中定义符号 TESTFILE
。然后,不要使用该构建配置。不过,您可能必须 select IDE 中的配置才能获得语法高亮显示。
另一种方法是编辑 .csproj
文件,正如您所建议的那样。假设 .NET 3.5 或更高版本,有一个名为 Remove
的项目属性,可以在 ItemGroup
位于 Target
内时使用。您可以在 BeforeBuild
目标中使用此属性从 Compile
项目中删除文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
...
<ItemGroup>
<Compile Include="CompileMe.cs" />
<Compile Include="NonCompiling\DoNotCompileMe.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
</ItemGroup>
...
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="BeforeBuild">
<ItemGroup>
<Compile Remove="NonCompiling\*" />
<Content Include="NonCompiling\*">
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
</Content>
</ItemGroup>
</Target>
...
</Project>
您的 BeforeBuild
目标定义出现在 Microsoft.CSharp.targets
的 Import
之后很重要。否则,您的自定义 BeforeBuild
目标将不会覆盖导入的默认空 BeforeBuild
目标。