在NuGet安装上将文件复制到Android项目

Jon*_*ate 6 c# xamarin.android nuget xamarin visual-studio-2017

期望的输出

我们想.dll通过NuGet包安装分发(NetStandard项目)和一些文件.在Xamarin.Android项目中安装时:

  • 文件(Directory.Buil.props)被复制到解决方案文件夹
  • 可执行文件(config.exe)被复制到项目文件夹中
  • 目录(Files)及其内容将复制到项目文件夹中

问题

  • 使用的项目PackageReference不会复制文件(content不支持)
  • 出于某种原因,使用.nuspec文件时; 源文件obj,bin等被包装过

理想情况下,我们希望:

  • 只使用一个.csproj文件(没有.nuspec)
  • 没有contentcontentFiles包装在一起.nupkg
  • 容易访问.dll.csproj
  • 安装新.nupkg版本时,旧文件将被覆盖

问题

(1)这可以PackageReferencecontentFiles吗?

(2)你能想到的最佳方法是什么?

谢谢.

回应

狮子座:

在Android项目中安装软件包时,文件不会出现在项目中.更不用说文件只是引用而不是复制(即使我有copyToOutput="true"):

NuGet包安装后的解决方案项目

狮子座(编辑):

我无法使用新的SDK csproj格式.取自您的链接:

免责声明:这仅适用于一小部分项目类型.

  • 类库项目
  • 控制台应用
  • ASP.NET核心Web应用程序
  • .NET核心

如果您正在构建ASP.NET 4(即非ASP.NET Core),WPF,Universal Windows或Xamarin项目,则必须坚持使用旧格式

Leo*_*SFT 0

(1) 这对于 PackageReference 和 contentFiles 可行吗?

恐怕您无法将这些文件添加到 Android 项目中,但我想在这里提供一个替代解决方案,将这些文件添加到输出文件夹中。

对于后两个要求,您可以直接使用PackageReference和,并且。但对于第一个要求,我们需要做更多的事情,因为它被复制到解决方案文件夹而不是项目文件夹。contentFilesconfig.exeFilesDirectory.Buil.props

对于后两个要求config.exe和,Files我们可以使用.nuspecfile 来contentFiles包含它们, need set copyToOutput="true",例如:

<?xml version="1.0" encoding="utf-8"?>
<package xmlns="http://schemas.microsoft.com/packaging/2011/08/nuspec.xsd">
  <metadata>
    <id>MyTestCore</id>
    <version>4.0.0</version>
    <authors>TestContentFile</authors>
    <owners>TestContentFile</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>Package Description</description>
    <contentFiles>
      <files include="any/any/config.exe" buildAction="content" flatten="true" copyToOutput="true"/>
      <files include="any/any/Files/1.txt" buildAction="content" flatten="true" copyToOutput="true"/>
      <files include="any/any/Files/2.txt" buildAction="content" flatten="true" copyToOutput="true"/>
    </contentFiles>
  </metadata>

  <files>
    <file src="contentFiles/any/any/config.exe" target="contentFiles/any/any/config.exe" />
    <file src="contentFiles/any/any/Files/1.txt" target="contentFiles/any/any/Files" />
    <file src="contentFiles/any/any/Files/2.txt" target="contentFiles/any/any/Files" />
  </files>
</package>
Run Code Online (Sandbox Code Playgroud)

打包后.nuspec并将生成的包安装到项目中。

但是,我们在“引用”节点下找不到这些文件。这是因为该项目仍然使用旧的csproj,而不packagereference使用新的sdk csproj。

旧 csproj 到新 csproj:Visual Studio 2017 升级指南

此外,不支持将文件复制到项目的源目录中,这对于经典项目来说是不鼓励的做法。该contentFiles部分控制为这些文件生成到 obj\projectname.csproj.nuget.g.props 文件中的 msbuild 项。并检查project.assets.json您可以找到的文件:

  "targets": {
    "MonoAndroid,Version=v7.1": {
      "MyTestCore/5.0.0": {
        "type": "package",
        "contentFiles": {
          "contentFiles/any/any/Files/1.txt": {
            "buildAction": "Content",
            "codeLanguage": "any",
            "copyToOutput": true,
            "outputPath": "1.txt"
          },
          "contentFiles/any/any/Files/2.txt": {
            "buildAction": "Content",
            "codeLanguage": "any",
            "copyToOutput": true,
            "outputPath": "2.txt"
          },
          "contentFiles/any/any/config.exe": {
            "buildAction": "Content",
            "codeLanguage": "any",
            "copyToOutput": true,
            "outputPath": "config.exe"
          }
        }
Run Code Online (Sandbox Code Playgroud)

请参阅:nuspec contentFiles 未添加到项目中

然后我们需要构建这个项目,这些文件将复制到输出文件夹。

对于第一个要求,为了将 .targets 文件添加Directory.Buil.props到解决方案文件夹中,我们需要在文件中创建一个自定义复制目标YourPackageName.targets,然后将此 .targets 文件添加到该\build文件夹​​中,.targets 文件如下所示:

<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

    <ItemGroup>  
        <MySourceFiles Include="<FilePath>\Directory.Buil.props"/>  
    </ItemGroup>  

    <Target Name="CopyFiles" BeforeTargets="Build">  
        <Copy  
            SourceFiles="@(MySourceFiles)"  
            DestinationFolder="<SolutionFolder>"  
        />  
    </Target>  

</Project>
Run Code Online (Sandbox Code Playgroud)

.nu​​spec 文件如下:

  <files>
    <file src="<>\xxx.targets" target="build" />
  </files>
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。

  • 这不适用于 Android 项目。我对结果进行了编辑。 (2认同)
  • @JonZarate,那是我的错。我忘记用 Android 项目测试它,只需用 `PackageReference` 测试它。我已经用更多信息更新了我的答案,您可以查看 **但是...** 部分以了解详细信息。希望这可以给您一些帮助:)。 (2认同)
  • 我添加了另一个回复。您在发布之前测试过这个吗? (2认同)
  • @JonZarate,是的,我已经测试过了。您是否看到过“我们在引用节点下找不到这些文件”这个词。和“这些文件将复制到输出文件夹。”?您要将这些文件添加到“引用”节点下的项目中吗?如果是的话,恐怕我无法提供其他有用的帮助:(。 (2认同)
  • 我想我错过了一些步骤。您可以上传解决方案并链接吗? (2认同)