命令行工具或 dotnet 工具在编译时删除未使用的使用

Command line tool or dotnet tool to remove unused using in compile time

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

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

因此,如果我们有工具可以删除未使用的 using 语句,那就太好了。编辑器命令当然不起作用,因为当我们重建项目时,生成的文件将重新生成。因此,mechasnim 在编译时必须是 运行,在生成器完成之后。

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

编辑 1: imput文件有一个简单的sample,就是generator的输入。

import valuedto.dml
import valuemodel.dml

service: SampleService
{
    controller: ValueController
    {
        public:
        {
            PublicValueDTO GetValue( string id );
        }
        public:
        {
            PrivateValueModel GetValuePrivate( string id );
        }
    }
}

如您所见,服务文件导入了两个不同的模型文件。一个 dml 文件包含 public dto-s,另一个包含私有模型。

生成器以此为输入,生成大量代码:

生成器之一是 只需收集 public 函数,并为第 3 方客户端创建程序集,以使用 public 接口.但在这种情况下很难决定必须使用哪些进口。在现实世界中,有 mor import,import is imported are other import recursively.

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



请将主要问题集中在您的回答中,而不是实际的实现中。因为它只是一个非常非常小的样本,而不是真实的样本(缺少版本、权限、路由、动词、多部分等...)



由于下面的原因 #1,删除“编译期间”是没有意义的。我怀疑你的意思是“手动 IDE/not 之外”。

但是,你为什么要关心?

  1. Using directives 没有 IL 工件,不会影响代码大小等
  2. 如果代码生成器由于额外使用而生成不明确的代码,无论如何都不可能删除“未使用”,并且生成代码无效,生成器需要修复。
  3. 通常,生成的代码应该被视为不可变和不透明的(并且不要查看它,除了调试)。不要太在意它的美

最后一点可以说是可以讨论的。就个人而言,我确实喜欢格式良好且简洁的生成代码,如果仅仅是为了推理它或在单步模式下调试它的话。但这将是生成器的工作。

话虽如此,有可用的 ReSharper 命令行工具可以在构建期间执行此操作(当心“寻找工具”的问题关闭 ;-))

再想一想:

But at generation time there is no way to decide which using is used and which is not used in later code.

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

你可以按 Ctrl+R , Ctrl+G (visual studio) 从工作文件中删除未使用的命名空间并对其进行排序。

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

免费的 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