Visual studio NuGet将文件复制到项目目录中

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=&

我创建了一个.nuspec文件,它打包了一堆.proto文件,以便在项目之间共享。这太棒了。不幸的是,对于要构建的.proto文件,它们实际上需要复制到项目目录,而不仅仅是引用。请注意,这是一个.NET核心项目

现在,我的定义创建了一个包,当使用该包时,它会引用项目中的文件,但这些文件仍然位于原始的.Nuget文件夹中,而这并不是我真正需要的

下面是我现在得到的.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="**\*.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>