我有一堆.cs
个文件,代表使用Roslyn API进行某些操作的测试用例。因为它们应该具有有效的编译时语法,所以我希望在写入这些文件时对这些文件提供Intellisense,Resharper和其他预编译时间检查,但是在构建解决方案时不要实际编译它们(因为测试只会查看语法)。
现在,我可能只为这些输入测试文件创建另一个项目(并确保它永远不会编译),但我宁愿将它们保留在测试项目中(我相信它们属于简单的缘故) )。我真的不在乎文件是否真的被包含在解决方案中,只要我最终能够进行语法检查(尽管这似乎不太可能)。
起初,我以为我可以简单地在.csproj
中排除编译目录,但我发现没有这样的属性允许这样做。我听说<CompileDependsOn>
可能会对我有所帮助,但我并不清楚如何理解。
我的直接问题是:是否可以对构建项目/解决方案时最终不会被编译的文件进行语法检查(Intellisense,Resharper等),而不将它们放在单独的非构建项目中?
答案 0 :(得分:1)
除了将构建操作更改为“Embedded resource”而不是将构建操作更改为“None”之外,它与https://stackoverflow.com/questions/29242600/compile-your-application-with-outer-documents类似。从我尝试它以来它不是100%肯定 - 它确实从编译中排除了文件,但是所有文本都改变了颜色,但智能感知似乎在那里。所有的resharper选项似乎仍然存在。
答案 1 :(得分:1)
我至少可以想到几个潜在的解决方案。
一种解决方案可能是使用预处理器定义。如果指令干扰您的测试,此解决方案可能不能令人满意,但如果您想尝试它,您的.cs文件可能如下所示:
#if TESTFILE
namespace ClassesNotToCompile
{
public class IndividualClassNotToCompile
{
...
}
}
#endif
然后,您需要在项目的构建配置中定义符号TESTFILE
。然后,不要使用该构建配置。但是,您可能必须在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
目标定义必须在Import
Microsoft.CSharp.targets
之后显示。否则,您的自定义BeforeBuild
目标不会覆盖导入的默认空BeforeBuild
目标。