Visual studio NuGet将文件复制到项目目录中
我创建了一个.nuspec文件,它打包了一堆.proto文件,以便在项目之间共享。这太棒了。不幸的是,对于要构建的.proto文件,它们实际上需要复制到项目目录,而不仅仅是引用。请注意,这是一个.NET核心项目 现在,我的定义创建了一个包,当使用该包时,它会引用项目中的文件,但这些文件仍然位于原始的.Nuget文件夹中,而这并不是我真正需要的 下面是我现在得到的.nuspec定义:Visual studio NuGet将文件复制到项目目录中,visual-studio,.net-core,nuget,nuget-package,nuspec,Visual Studio,.net Core,Nuget,Nuget Package,Nuspec,我创建了一个.nuspec文件,它打包了一堆.proto文件,以便在项目之间共享。这太棒了。不幸的是,对于要构建的.proto文件,它们实际上需要复制到项目目录,而不仅仅是引用。请注意,这是一个.NET核心项目 现在,我的定义创建了一个包,当使用该包时,它会引用项目中的文件,但这些文件仍然位于原始的.Nuget文件夹中,而这并不是我真正需要的 下面是我现在得到的.nuspec定义: <?xml version="1.0"?> <package xmlns=&
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>GRPCProtoFiles</id>
<version>1.0.0</version>
<authors>Author</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>.proto files NuGet package.</description>
<dependencies>
<dependency id="Google.Protobuf" version="3.14.0"/>
<dependency id="Grpc" version="2.35.0"/>
</dependencies>
<contentFiles>
<files include="any/any/Protos/**/*.proto" buildAction="None" copyToOutput="false" />
</contentFiles>
</metadata>
<files>
<file src="**\*.proto" target="contentFiles\any\any\Protos" exclude="google\**" />
</files>
</package>
我知道build action当前设置为none,但我可以在安装包时将文件放到正确的文件夹中后修复它。同样,如果我尝试将proto文件的构建操作设置为正确的Protobuf编译器,那么我会得到一个错误,因为文件不在它们应该位于的位置
我做错了什么
编辑:
好的,我已经读了一些关于可能发生的事情和原因的资料。具体的回答给了我很多见解。然而,我在想,我如何才能真正做我需要做的事情。现在看来,我想用NuGet做的事情是不可能的,我使用了错误的工具来完成这项工作。但是除了这个限制之外,NuGet看起来很理想——它能够从源项目中选择.proto文件,然后发布这些文件,而不是为各种目标系统预构建库
我可能会添加一个预构建操作来将文件复制到projectdir,但是我不知道如何引用源numget包文件夹,尤其是在版本更改时。你知道这个问题是否有解决办法吗?我真的知道你的想法。首先,使用buildactionnone将这些原型文件打包到nupkg中。然后在主项目下使用预构建事件来处理来自nupkg的文件。问题是如何使用msbuild属性从nupkg获取文件,因为Net Core项目使用链接属性引用主项目下的文件,而不是将真正的nuget文件复制到主项目文件夹中 在链接属性下,您无法更改该文件的生成操作,因为它实际上不存在于主项目文件夹下,并且主项目没有处理该文件的职责 有两个函数可以解决此问题: ============================================= 功能一 您可以直接在nupkg本身下执行此操作,然后,在使用nuget包的构建过程中会自动复制原型文件。请尝试以下步骤,您不应该从安装nuget软件包的另一个主项目添加任何复制任务 您必须在nupkg中使用.props/targets文件才能获得所需的内容。参考 1创建一个名为.props文件的文件。在您这边,它应该命名为GRPCProtoFiles.props,这样它就可以工作了 2在GRPCProtoFiles.props文件中添加以下内容: 整个GRPCProtoFiles.nuspec文件应如下所示:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>GRPCProtoFiles</id>
<version>1.0.0</version>
<authors>Author</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>.proto files NuGet package.</description>
<dependencies>
<dependency id="Google.Protobuf" version="3.14.0"/>
<dependency id="Grpc" version="2.35.0"/>
</dependencies>
<contentFiles>
<files include="any/any/Protos/**/*.proto" buildAction="None" copyToOutput="false" />
</contentFiles>
</metadata>
<files>
<file src="xxx.proto" target="contentFiles\any\any\Protos" exclude="google\**" />
<file src="build\*.props" target="build" />
</files>
</package>
<ItemGroup>
<PackageReference Include="GRPCProtoFiles" Version="1.0.0">
<GeneratePathProperty>true</GeneratePathProperty>
</PackageReference>
</ItemGroup>
然后,右键单击项目A->属性->生成事件->在预生成事件命令行下添加这些:
或者,将此目标添加到ProjectA.csproj文件中:
我真的知道你的想法。首先,使用buildactionnone将这些原型文件打包到nupkg中。然后在主项目下使用预构建事件来处理来自nupkg的文件。问题是如何使用msbuild属性从nupkg获取文件,因为Net Core项目使用链接属性引用主项目下的文件,而不是将真正的nuget文件复制到主项目文件夹中 在链接属性下,您无法更改该文件的生成操作,因为它实际上不存在于主项目文件夹下,并且主项目没有处理该文件的职责 有两个函数可以解决此问题: ============================================= 功能一 您可以直接在nupkg本身下执行此操作,然后,在使用nuget包的构建过程中会自动复制原型文件。请尝试以下步骤,您不应该从安装nuget软件包的另一个主项目添加任何复制任务 您必须在nupkg中使用.props/targets文件才能获得所需的内容。参考 1创建一个名为.props文件的文件。在您这边,它应该命名为GRPCProtoFiles.props,这样它就可以工作了 2在GRPCProtoFiles.props文件中添加以下内容: 整个GRPCProtoFiles.nuspec文件应如下所示:
<?xml version="1.0"?>
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
<metadata>
<id>GRPCProtoFiles</id>
<version>1.0.0</version>
<authors>Author</authors>
<requireLicenseAcceptance>false</requireLicenseAcceptance>
<description>.proto files NuGet package.</description>
<dependencies>
<dependency id="Google.Protobuf" version="3.14.0"/>
<dependency id="Grpc" version="2.35.0"/>
</dependencies>
<contentFiles>
<files include="any/any/Protos/**/*.proto" buildAction="None" copyToOutput="false" />
</contentFiles>
</metadata>
<files>
<file src="xxx.proto" target="contentFiles\any\any\Protos" exclude="google\**" />
<file src="build\*.props" target="build" />
</files>
</package>
<ItemGroup>
<PackageReference Include="GRPCProtoFiles" Version="1.0.0">
<GeneratePathProperty>true</GeneratePathProperty>
</PackageReference>
</ItemGroup>
然后,右键单击项目A->属性->生成事件->在预生成事件命令行下添加这些:
或者,将此目标添加到ProjectA.csproj文件中:
回答得好!这真的很有帮助。愿上帝保佑你。我希望我能不止一次地投票回答得好!回答得好!这真的很有帮助。愿上帝保佑你。我希望我能不止一次地投票回答得好!
xcopy /s /e /y /i $(PkgGRPCProtoFiles)\contentFiles\any\any\Protos $(ProjectDir)\Protos
<Target Name="CopyFiles" BeforeTargets="PrepareForBuild">
<ItemGroup>
<File Include="$(PkgGRPCProtoFiles)\contentFiles\**\*.*"></File>
</ItemGroup>
<Copy SourceFiles="@(File)" DestinationFolder="$(ProjectDir)\Protos"></Copy>
</Target>