C# 仅在其他文件夹中包含特定nuget包的.xml文件

C# 仅在其他文件夹中包含特定nuget包的.xml文件,c#,visual-studio,.net-core,asp.net-core-mvc,nuget,C#,Visual Studio,.net Core,Asp.net Core Mvc,Nuget,我们在一个解决方案中有一个项目(ProjectAbc),它引用一个nuget包(这是我们与其他解决方案不同的项目[ProjectXyz])。我们使用.net核心框架和包引用将nuget包(ProjectXyz)包含在.csproj文件中 <PackageReference Include="ProjectXyz" Version="1.1.2.3" /> 我们只希望在下面的文件夹中直接生成ProjectXyz nuget包的ProjectXy

我们在一个解决方案中有一个项目(ProjectAbc),它引用一个nuget包(这是我们与其他解决方案不同的项目[ProjectXyz])。我们使用.net核心框架和包引用将nuget包(ProjectXyz)包含在.csproj文件中

<PackageReference Include="ProjectXyz" Version="1.1.2.3" />
我们只希望在下面的文件夹中直接生成ProjectXyz nuget包的ProjectXyz.xml

ProjectAbc
我找到了许多文章,它们指导我做不同的事情,比如在构建或使用相对路径后将文件复制到输出目录。尽管尝试了不同的方法,我还是不断地犯各种错误。这可能是因为我不知道.csproj文件中的语法,也可能是因为我不确定自己在做什么

在上述情况下,复制文件或直接在所需文件夹中生成文件的最佳方式是什么



对于我的评论回应:

因为我无法在@Perry Qian MSFT的评论中粘贴截图。所以把它贴在这里

2020年8月20日------套餐截图---------------------------

您可以使用nuget projectProjectXyz中的
.props
文件将该文件复制到ProjectAbc的项目文件夹中。你应该使用

1)首先在您的ProjectXyz项目中,创建一个名为
build
的文件夹,然后添加一个名为
.props
的文件,在您的一侧,该文件名为
ProjectXyz.props

2)将这些添加到
ProjectXyz.props
文件中:

<Project>
  <Target Name="CopyFilesToProject" BeforeTargets="Build">
    <Message Text="Copying ProjectXyz.xml to project" />
    <ItemGroup>
      <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\content\any\any\**\*.*"/> //file from the ProjectXyz nuget package
    </ItemGroup>
    <Copy
       SourceFiles="@(SourceScripts)"
       DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\%(RecursiveDir)%(Filename)%(Extension)')"     //copy into the main ProjectAbc project folder
         />
  </Target>
  
</Project>
 <ItemGroup>
    <Content Include="bin\Debug\xxx\ProjectXyz.xml(the path of the ProjectXyz.xml)" Pack="true" 
    PackagePath="content\any\any;contentFiles\any\any\;;"> 
    <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>

    <None Include="build\ProjectXyz.props" Pack="true" PackagePath="build\$(TargetFramework)"/>
  </ItemGroup>
<ItemGroup>
    <Content Include="bin\Debug\netcoreapp3.1\ProjectXyz.xml" Pack="true" PackagePath="XmlFolder">
      <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>

    <None Include="build\ProjectXyz.props" Pack="true" PackagePath="build\$(TargetFramework)"/>
  </ItemGroup>
<Project>
  <Target Name="CopyFilesToProject" BeforeTargets="Build">
    <Message Text="Copying ProjectXyz.xml to project" />
    <ItemGroup>

    //ProjectXyz.xml file from the ProjectXyz nuget package
      <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\XmlFolder\**\*.*"/>
    </ItemGroup>

   //copy ProjectXyz.xml file into the main ProjectAbc project folder
    <Copy
       SourceFiles="@(SourceScripts)"
       DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\%(RecursiveDir)%(Filename)%(Extension)')"    
         />
  </Target>
  
</Project>
<PropertyGroup>
    <ProjectXyz_Flag>true</ProjectXyz_Flag>
</PropertyGroup>
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
    <!-- ... -->
    </metadata>
    <files>
       
        <file src="xxx\ProjectXyz.xml" target="XmlFolder" />

        
        <file src="build\ProjectXyz.props" target="build\netcoreapp3.1" />
    </files>
</package>
4)然后您应该打包新的ProjectXyz项目

5)然后你完成包装,你应该先

然后在您的项目ABC项目中,您应该卸载旧的项目,然后安装新的项目XYZnuget软件包

之后您应该首先构建ProjectAbc项目,然后您将看到nuget包中的xml文档位于项目ABC的项目文件夹下

==================================================================== 更新1

ProjectXyz项目是
netcore
netstandard
,而ProjectAbc
netcore

首先,为了帮助您理解这个问题,我尝试将
ProjectXyz.xml
文件打包到
ProjectXyz.nupkg
中的其他文件夹中

1)首先,更改为在
ProjectXyz.csproj
文件中使用这些xml内容:

<Project>
  <Target Name="CopyFilesToProject" BeforeTargets="Build">
    <Message Text="Copying ProjectXyz.xml to project" />
    <ItemGroup>
      <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\content\any\any\**\*.*"/> //file from the ProjectXyz nuget package
    </ItemGroup>
    <Copy
       SourceFiles="@(SourceScripts)"
       DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\%(RecursiveDir)%(Filename)%(Extension)')"     //copy into the main ProjectAbc project folder
         />
  </Target>
  
</Project>
 <ItemGroup>
    <Content Include="bin\Debug\xxx\ProjectXyz.xml(the path of the ProjectXyz.xml)" Pack="true" 
    PackagePath="content\any\any;contentFiles\any\any\;;"> 
    <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>

    <None Include="build\ProjectXyz.props" Pack="true" PackagePath="build\$(TargetFramework)"/>
  </ItemGroup>
<ItemGroup>
    <Content Include="bin\Debug\netcoreapp3.1\ProjectXyz.xml" Pack="true" PackagePath="XmlFolder">
      <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>

    <None Include="build\ProjectXyz.props" Pack="true" PackagePath="build\$(TargetFramework)"/>
  </ItemGroup>
<Project>
  <Target Name="CopyFilesToProject" BeforeTargets="Build">
    <Message Text="Copying ProjectXyz.xml to project" />
    <ItemGroup>

    //ProjectXyz.xml file from the ProjectXyz nuget package
      <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\XmlFolder\**\*.*"/>
    </ItemGroup>

   //copy ProjectXyz.xml file into the main ProjectAbc project folder
    <Copy
       SourceFiles="@(SourceScripts)"
       DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\%(RecursiveDir)%(Filename)%(Extension)')"    
         />
  </Target>
  
</Project>
<PropertyGroup>
    <ProjectXyz_Flag>true</ProjectXyz_Flag>
</PropertyGroup>
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
    <!-- ... -->
    </metadata>
    <files>
       
        <file src="xxx\ProjectXyz.xml" target="XmlFolder" />

        
        <file src="build\ProjectXyz.props" target="build\netcoreapp3.1" />
    </files>
</package>
它的目标是,当您安装此nuget软件包时,它将首先运行此目标以将
ProjectXyz.xml
文件从nuget软件包复制到主项目ProjectAbc

注意

安装完nuget软件包后,首先生成ProjectAbcproject,该文件将存在于ProjectAbcproject文件夹中

3)然后右键单击项目XYZ
-->属性-->打包,打包项目

安装新的项目XYZ时,应首先删除下的所有文件

C:\Users\xxx(当前用户)\.nuget\packages

另外,我还有一个问题,ProjectXyz正在被引用 在多个项目中,如ProjectAbc、Project123。我们不想要 ProjectXyz.xml文件显示在Project123中,但仅显示在ProjectAbc中。我 使用上述解决方案进行猜测,它可能会显示在两个引用中 项目

为此,您只需要在CopyFilesToProject目标中添加如下条件:
$(ProjectXyz_Flag)=true
,然后在
ProjectAbc.csproj
文件中创建一个属性
ProjectXyz_Flag
,并将其值设置为
true

生成ProjectAbcproject时,它将根据当前设置的开关变量确定是否复制文件

a)
ProjectXyz.props
文件中添加名为
$(ProjectXyz_标志)
的条件:

<Project>
  <Target Name="CopyFilesToProject" BeforeTargets="Build">
    <Message Text="Copying ProjectXyz.xml to project" />
    <ItemGroup>
      <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\content\any\any\**\*.*"/> //file from the ProjectXyz nuget package
    </ItemGroup>
    <Copy
       SourceFiles="@(SourceScripts)"
       DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\%(RecursiveDir)%(Filename)%(Extension)')"     //copy into the main ProjectAbc project folder
         />
  </Target>
  
</Project>
 <ItemGroup>
    <Content Include="bin\Debug\xxx\ProjectXyz.xml(the path of the ProjectXyz.xml)" Pack="true" 
    PackagePath="content\any\any;contentFiles\any\any\;;"> 
    <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>

    <None Include="build\ProjectXyz.props" Pack="true" PackagePath="build\$(TargetFramework)"/>
  </ItemGroup>
<ItemGroup>
    <Content Include="bin\Debug\netcoreapp3.1\ProjectXyz.xml" Pack="true" PackagePath="XmlFolder">
      <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>

    <None Include="build\ProjectXyz.props" Pack="true" PackagePath="build\$(TargetFramework)"/>
  </ItemGroup>
<Project>
  <Target Name="CopyFilesToProject" BeforeTargets="Build">
    <Message Text="Copying ProjectXyz.xml to project" />
    <ItemGroup>

    //ProjectXyz.xml file from the ProjectXyz nuget package
      <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\XmlFolder\**\*.*"/>
    </ItemGroup>

   //copy ProjectXyz.xml file into the main ProjectAbc project folder
    <Copy
       SourceFiles="@(SourceScripts)"
       DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\%(RecursiveDir)%(Filename)%(Extension)')"    
         />
  </Target>
  
</Project>
<PropertyGroup>
    <ProjectXyz_Flag>true</ProjectXyz_Flag>
</PropertyGroup>
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
    <!-- ... -->
    </metadata>
    <files>
       
        <file src="xxx\ProjectXyz.xml" target="XmlFolder" />

        
        <file src="build\ProjectXyz.props" target="build\netcoreapp3.1" />
    </files>
</package>

然后重新打包您的项目xyz项目,并像我前面所说的那样执行几个干净的步骤

ProjectAbc项目中安装该软件包时,应在
ProjectAbc.csproj
文件中添加此类属性:

<Project>
  <Target Name="CopyFilesToProject" BeforeTargets="Build">
    <Message Text="Copying ProjectXyz.xml to project" />
    <ItemGroup>
      <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\content\any\any\**\*.*"/> //file from the ProjectXyz nuget package
    </ItemGroup>
    <Copy
       SourceFiles="@(SourceScripts)"
       DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\%(RecursiveDir)%(Filename)%(Extension)')"     //copy into the main ProjectAbc project folder
         />
  </Target>
  
</Project>
 <ItemGroup>
    <Content Include="bin\Debug\xxx\ProjectXyz.xml(the path of the ProjectXyz.xml)" Pack="true" 
    PackagePath="content\any\any;contentFiles\any\any\;;"> 
    <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>

    <None Include="build\ProjectXyz.props" Pack="true" PackagePath="build\$(TargetFramework)"/>
  </ItemGroup>
<ItemGroup>
    <Content Include="bin\Debug\netcoreapp3.1\ProjectXyz.xml" Pack="true" PackagePath="XmlFolder">
      <PackageCopyToOutput>true</PackageCopyToOutput>
    </Content>

    <None Include="build\ProjectXyz.props" Pack="true" PackagePath="build\$(TargetFramework)"/>
  </ItemGroup>
<Project>
  <Target Name="CopyFilesToProject" BeforeTargets="Build">
    <Message Text="Copying ProjectXyz.xml to project" />
    <ItemGroup>

    //ProjectXyz.xml file from the ProjectXyz nuget package
      <SourceScripts Include="$(MSBuildThisFileDirectory)..\..\XmlFolder\**\*.*"/>
    </ItemGroup>

   //copy ProjectXyz.xml file into the main ProjectAbc project folder
    <Copy
       SourceFiles="@(SourceScripts)"
       DestinationFiles="@(SourceScripts -> '$(MSBuildProjectDirectory)\%(RecursiveDir)%(Filename)%(Extension)')"    
         />
  </Target>
  
</Project>
<PropertyGroup>
    <ProjectXyz_Flag>true</ProjectXyz_Flag>
</PropertyGroup>
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
    <metadata>
    <!-- ... -->
    </metadata>
    <files>
       
        <file src="xxx\ProjectXyz.xml" target="XmlFolder" />

        
        <file src="build\ProjectXyz.props" target="build\netcoreapp3.1" />
    </files>
</package>
Third,运行
nuget pack
打包此项目

==============================================================

更新3

请先清理您的nuget缓存或删除
C:\Users\xxx(当前用户)\.nuget\packages
下的所有nuget缓存。然后重新安装nuget软件包

另外,请确保
xxx.props
名称与您的nuget
包id
相同

如果您的nuget包调用
ProjectXyz
(包id)。然后,props文件应命名为
ProjectXyz.props

除了,您还应该在
工具
-->选项-->项目和解决方案-->-->
构建和运行
下,将
msbuild项目构建输出详细程度
设置为
详细

然后,重建项目ABC,检查目标是否执行

======================================================

更新4

您应该确保在打包包
project.mnop
时,确保
project.mnop.props
文件没有语法错误

例如,我在props文件中错误地编写了类似于
asdczxcx
的内容,但是,由于props文件的构建操作