Nuget 包不仅在最初,而且在每个打开的解决方案中静默地将已删除的文件添加回项目目录

Nuget package silently adds back deleted files to project directory not only initially, but on every solution open

这是一个已安装的 nuget 包 https://www.nuget.org/packages/AppDynamics.Agent.Windows/,它在第一次安装时将 AppDynamicsConfig.json 和 AppDynamicsAgentLog.config 添加到项目目录。

如果您删除这些文件中的任何一个,它将自动以静默方式恢复。我知道这种行为是在 nuget 包规范中明确设置的,但有几个问题:

  1. 如何在不更改 nuget 包本身的情况下禁用此行为?我发现的唯一方法是添加假文件,它之所以有效,是因为 nuget 规范设置为“仅当文件不存在时才恢复”。但这只是一种解决方法,禁用它应该是一种正常的方法。

  2. 它在打开解决方案的那一刻静默工作,如果打开解决方案,它也几乎立即工作。相关的 nuget/build/whatever 任务是如何命名的以及此还原的日志显示在何处?

How this behaviour can be disabled without changes in nuget package itself? The only way that i've found is to add fake file, it works because nuget specs set as 'restore only if file doesn't exist'. But it's just a workaround, it should be a normal way to disable it.

答案是否定的。如果您不愿意更改该 nuget 包中的文件,则无法禁用该行为。至少现在没有正常的方法来禁用它。

It works silently on a moment of the opening solution and also works almost immediatly if solution is open. How the related nuget/build/whatever task is named and where logs for this restore is presented?

相关的构建目标被命名为CreateAppDynamicsConfigFiles,定义在AppDynamics.Agent.Windows.targets路径中:appdynamics.agent.windows.5.16\build\netcoreapp2.0.

并且没有日志 用于此静默恢复,导致此目标 运行s 在构建之前。所以正常的 VS 输出 window(显示构建日志,nuget 包日志...)不能有任何日志。(此外,作者在创建时没有定义在该目标中写入日志的自定义方式包)

帮助我们理解上面否定答案的详细描述:

查看部分内容:

<Target Name="CreateAppDynamicsConfigFiles" BeforeTargets="BeforeBuild;CompileDesignTime"
        Inputs="$(AppDynamicsAgentDistribMicro)\AppDynamicsAgentLog.config;$(AppDynamicsAgentDistribMicro)\AppDynamicsConfig.json"
        Outputs="AppDynamicsAgentLog.config;AppDynamicsConfig.json">

此目标的 BeforeTargets=BeforeBuild;CompileDesignTime,因此此目标比 CompileDesignTime 目标早 运行 秒。

此目标是 VS IDE 的特定目标。代表我们在VS code中开发editor.So之前CreateAppDynamicsConfigFiles的时间,在加载Solution或者打开Solution(开发可用)的时候会一直执行).

当打开(加载)解决方案时,目标总是运行,让我们看看这个目标中的任务:

<Copy SourceFiles="$(AppDynamicsAgentDistribMicro)\AppDynamicsAgentLog.config" DestinationFolder="." SkipUnchangedFiles="True" Condition="!Exists('AppDynamicsAgentLog.config')" />

所以: 当使用该包的项目打开时,VS 将始终 运行 目标 => 目标中的复制任务将 运行 如果 AppDynamicsAgentLog.config项目文件夹中不存在=>出现奇怪的行为(如果解决方案是打开的,更准确地说,项目是打开的,文件总是会被恢复)

建议:

如果您不想更改包本身,

1.There 没有正常的方法来禁用它。在创建 nuget 包时,您可能必须联系包的作者以添加选项(a msbuild 属性)。

2.If你愿意修改已安装的包,你可以通过修改目标暂时禁用行为。(添加condition=false到该目标并对其他类似目标执行一些类似的操作)。如果不需要,您还可以考虑从您的项目中删除该包。

3.Use 你的解决方法(假文件)...

希望以上内容能解决您对这个问题的困惑:) 如果我有任何误解,请随时纠正我!