C# 仅在其他文件夹中包含特定nuget包的.xml文件
我们在一个解决方案中有一个项目(ProjectAbc),它引用一个nuget包(这是我们与其他解决方案不同的项目[ProjectXyz])。我们使用.net核心框架和包引用将nuget包(ProjectXyz)包含在.csproj文件中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
<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文件的构建操作