命令行工具或.net工具删除编译时不使用的使用



是否有办法在编译时删除未使用的using语句?它可以是任何cli工具或dotnet工具。

原因如下:我们有代码生成器,这个代码生成器生成了很多using,但在某些情况下使用是必要的,而有些情况下不需要。但是在生成时,没有办法决定在以后的代码中使用哪个using和不使用哪个using。

所以当我们有工具来删除未使用的using语句时,这将是伟大的。编辑器命令当然不起作用,因为当我们重新构建项目时,生成的文件将是新生成的。因此,该机制必须在编译时运行,在生成器完成之后。

我检查了dotnet-format工具,但是没有这个选项。

编辑1:这里有一个简单的输入文件示例,它是生成器的输入。

import valuedto.dml
import valuemodel.dml
service: SampleService
{
controller: ValueController
{
public:
{
PublicValueDTO GetValue( string id );
}
public:
{
PrivateValueModel GetValuePrivate( string id );
}
}
}

可以看到,服务文件导入了两个不同的模型文件。一个dml文件包含公共模型,另一个包含私有模型。

生成器使用这个作为输入,生成大量代码:

<
  • 客户端接口/gh>
  • http客户端实现
  • <
  • 控制器实现/gh>
  • 客户dll
  • 等等…

其中一个生成器是只是收集公共函数,并为第三方客户端创建程序集,以使用公共接口。但在这种情况下,很难决定必须使用哪些进口。在现实世界中,有更多的导入,被导入的都是其他递归导入。

如果公共接口包含私有模型的using-s,生成的代码不可编译



请集中回答主要问题,而不是实际实现。因为它只是一个非常非常小的示例,而不是一个真正的示例(缺少版本,权限,路由,动词,multipart等…)



免费的jetbrains cli工具可以做代码清理。删除未使用的using指令是它能做的事情之一。

https://www.jetbrains.com/help/resharper/ReSharper_Command_Line_Tools.html install-and-use-resharper-command-line-tools-as-net-core-tools

在编译过程中删除"这毫无意义,原因如下#1。我怀疑你的意思是"在IDE之外",而不是"手动"。

但是,你为什么要在意呢?

  1. Using指令不是IL工件,也不会增加代码的大小。
  2. 如果代码生成器因为额外的使用而产生了不明确的代码,删除"未使用的";是不可能的,生成代码是无效的,生成器需要修复。
  3. 通常,生成的代码应该被视为不可变和不透明的(并且不要查看它,除非可能调试)。不要太在意它的美。

最后一点是可以讨论的。就我个人而言,我确实关心格式良好和简洁的生成代码,而且唯一的原因是对它进行推理或在单步模式下调试它。但那将是生成器的工作。

话虽如此,有ReSharper命令行工具可用,可能能够在构建期间做到这一点(注意"寻找工具"的问题闭包)。; -))

再思考一下:

但是在生成时没有办法决定使用哪个using并且在以后的代码中不使用。

我对此表示质疑。生成器应该知道以后生成/使用的确切类型。毕竟,通常首先在内存中生成AST或类似的内容,然后将其写入文件。如果不是,发电机的设计可能是……简单的?例如,首先脱口而出一堆使用指令可能是东西,然后实际的代码?如果您可以选择改进实际的生成器—无论如何,这将是处理此类事情的正确位置—您应该对此提出一个具体的问题并解释,为什么在您的情况下,您认为在生成实际文件之前它不能知道事情。

您可以按Ctrl+RCtrl+G(visual studio)从工作文件中删除未使用的使用和排序名称空间。

我也一直在寻找一个工具。这应该是一个特殊的工具,不应该是编译阶段的一部分。

最新更新