VS2017在生成后事件中删除NuGet文件

VS2017在生成后事件中删除NuGet文件,nuget,visual-studio-2017,Nuget,Visual Studio 2017,与复制其文件的NuGet包相关的项目生成后事件的执行顺序是什么?我有一个NuGet包,它将不必要的文件复制到我的输出目录(有DLL和EXE,在我的情况下,我不需要后者)。通常的想法是 del /f /q "$(TargetDir)directory\*.exe" 不起作用,很可能是在VS(MSBuild)实际复制这些文件之前调用的 很可能是在VS(MSBuild)实际复制这些文件之前调用的 根据评论中的信息: ,这是 从包目标文件 此导入MSBuild目标将在生成完成后执行复制任务,这将导致生

与复制其文件的NuGet包相关的项目生成后事件的执行顺序是什么?我有一个NuGet包,它将不必要的文件复制到我的输出目录(有DLL和EXE,在我的情况下,我不需要后者)。通常的想法是

del /f /q "$(TargetDir)directory\*.exe"
不起作用,很可能是在VS(MSBuild)实际复制这些文件之前调用的

很可能是在VS(MSBuild)实际复制这些文件之前调用的

根据评论中的信息:

,这是 从包目标文件

此导入MSBuild目标将在生成完成后执行复制任务,这将导致生成后的delete命令行失败。这就是为什么
CopyNativeBinaries
目标在
PostBuildEvent
之后出现四个步骤的原因

要解决此问题,我们可以将生成后事件命令行转换为目标,顺序为target
CopyNativeBinaries

详细步骤:

  • 删除生成后事件
  • 卸载您的项目。然后在项目的最后,在结束标记之前,放置以下脚本:

    <Target Name="DeleteFile" AfterTargets="CopyNativeBinaries">
      <ItemGroup>
        <FileToDelete Include="$(TargetDir)directory\*.exe"/>
      </ItemGroup>
      <Exec Command="del /F /Q &quot;@(FileToDelete)&quot;"/>
    </Target>
    
    
    
  • 在此设置之后,将在目标
    CopyNativeBinaries
    之后执行
    DeleteFile

    很可能是在VS(MSBuild)实际复制这些文件之前调用的

    根据评论中的信息:

    ,这是 从包目标文件

    此导入MSBuild目标将在生成完成后执行复制任务,这将导致生成后的delete命令行失败。这就是为什么
    CopyNativeBinaries
    目标在
    PostBuildEvent
    之后出现四个步骤的原因

    要解决此问题,我们可以将生成后事件命令行转换为目标,顺序为target
    CopyNativeBinaries

    详细步骤:

  • 删除生成后事件
  • 卸载您的项目。然后在项目的最后,在结束标记之前,放置以下脚本:

    <Target Name="DeleteFile" AfterTargets="CopyNativeBinaries">
      <ItemGroup>
        <FileToDelete Include="$(TargetDir)directory\*.exe"/>
      </ItemGroup>
      <Exec Command="del /F /Q &quot;@(FileToDelete)&quot;"/>
    </Target>
    
    
    
  • 在此设置之后,
    DeleteFile
    将在目标
    CopyNativeBinaries
    之后执行,这对我来说很有效(MSBUILD v15)

    
    
    这对我有用(MSBUILD v15)

    
    
    将文件复制到输出目录将不是NuGet,而是MSBuild。你的NuGet软件包到底是什么样子的?我假设它在lib目录中有所有这些文件,所以NuGet将在项目文件中添加对这些文件的引用。如果您想避免这种情况,我将考虑在NuGet包中使用自定义MSBuild目标文件,以便您可以自定义生成,或者可能只是将任何.exe文件添加到NuGet包中的tools文件夹中。但是,我不确定您希望NuGet软件包做什么。另外:
    packages.config
    基于项目还是使用新的
    ProjectReference
    系统?(后一个可以从包中排除资产(编译/contentFIles/…))新的。对于前面的(包文件夹),是的,我可以简单地修改包的本地副本并删除不必要的文件。但使用较新的缓存机制并不是那么简单。如果我能避免的话,我真的不想改变NuGet。我只是想在一切完成后从输出中删除一些不必要的文件。我将检查排除。将MSBuild日志更改为详细信息(工具->选项->项目和解决方案->生成并运行)后,您将发现实际复制操作在执行生成后事件之前完成。您可以使用
    echo
    显式记录已执行的目标。因此,您应该仔细检查delete命令行为什么不删除.exe文件。顺便问一下,那个包裹是定制的吗?如果没有,您可以将软件包ID和您不想复制的文件共享给我,我将对其进行测试。iMobileDevice-net,将有两个win7 xxx文件夹,其中包含DLL和EXE,第二个文件夹对于程序的运行是不必要的。我不知道他们为什么会出现在那里,我会联系开发人员,但我认为无论发生什么,删除他们都很容易。谢谢。将文件复制到输出目录不是NuGet,而是MSBuild。你的NuGet软件包到底是什么样子的?我假设它在lib目录中有所有这些文件,所以NuGet将在项目文件中添加对这些文件的引用。如果您想避免这种情况,我将考虑在NuGet包中使用自定义MSBuild目标文件,以便您可以自定义生成,或者可能只是将任何.exe文件添加到NuGet包中的tools文件夹中。但是,我不确定您希望NuGet软件包做什么。另外:
    packages.config
    基于项目还是使用新的
    ProjectReference
    系统?(后一个可以从包中排除资产(编译/contentFIles/…))新的。对于前面的(包文件夹),是的,我可以简单地修改包的本地副本并删除不必要的文件。但使用较新的缓存机制并不是那么简单。如果我能避免的话,我真的不想改变NuGet。我只是想在一切完成后从输出中删除一些不必要的文件。我将检查排除。将MSBuild日志更改为详细信息(工具->选项->项目和解决方案->生成并运行)后,您将发现实际复制操作在执行生成后事件之前完成。您可以使用
    echo
    显式记录已执行的目标。因此,您应该仔细检查delete命令行为什么不删除.exe文件。顺便问一下,那个包裹是定制的吗?如果没有,您可以将软件包ID和您不想复制的文件共享给我,我将对其进行测试。iMobileDevice-net,将有两个win7 xxx文件夹,其中包含DLL和EXE,第二个文件夹对于程序的运行是不必要的。我不知道他们为什么会在冷杉林里