title author date CreateTime categories
Roslyn 打包自定义的文件到 NuGet 包
lindexi
2019-10-22 19:45:34 +0800
2019-7-9 17:3:4 +0800
Roslyn MSBuild 编译器 nuget 打包

在使用 sdk 格式的项目文件支持快速进行打包,但使用这个方式打包的时候将默认只带程序集输出文件,而没有带依赖的文件。本文告诉大家如何在打包的时候加上需要放在包里面的文件

在 VisualStudio 使用新项目格式快速打出 Nuget 包 告诉大家快速打包的方法,但有时候我需要将本地的一些资源或依赖也放在包里面,此时就需要用到下面的方法

在项目里面引用的资源,可以通过在引用的时候添加 Pack 属性设置打包,使用 PackagePath 属性设置打包的时候放在包里面的哪个文件夹

例如将项目里面引用的 林德熙是逗比.txt 打包放在 lib\doubi 文件夹里面,可以这样写

<None Include="林德熙是逗比.txt"
Pack="True"
PackagePath="\lib\doubi\" />

注意需要将 None 放在 ItemGroup 里面,请看代码

    <ItemGroup>
<None Include="林德熙是逗比.txt"
Pack="True"
PackagePath="\lib\doubi\" />
</ItemGroup>

如果在这一行代码执行之前已经添加了引用这个文件,那么请将 Include 修改为 Update 请看下面代码

    <ItemGroup>
<None Include="*.txt"/>
<!-- 上面的代码使用 *.txt 包含了 林德熙是逗比.txt 文件,需要在下面代码使用更新 -->
<None Update="林德熙是逗比.txt"
Pack="True"
PackagePath="\lib\doubi\" />
</ItemGroup>

而如果是引用了输出文件里面的某个 dll 如我引用了 Newtonsoft.Json.dll 这个库文件,我需要在 bin\release 文件夹里面引用文件,那么我将需要这样写

        <ItemGroup>
<None Include="$(OutputPath)\net48\Newtonsoft.Json.dll"
Pack="True"
PackagePath="\tools\net48\Newtonsoft.Json.dll" />
</ItemGroup>

上面代码将会在输出文件夹找到 Newtonsoft.Json.dll 将这个文件输出到打包文件夹里面

如果我是需要在运行过程引用的一些 C++ 运行库,那么同样可以上面方法

另外在输出的时候也支持改名,例如在写 NuGet 的时候,在修改编译过程的 targets 和 props 文件是需要跟随包的名才能被执行。例如在 Roslyn 通过 Target 修改编译的文件 写到的替换编译文件,此时要求对应的文件有规定的命名

在 NuGet 里面,要求执行的 targets 文件必须满足命名要求,需要命名为 NuGet包id.targets 才会被执行,对应的 props 文件也相同

如果是自己手写文件名,在更改 NuGet 包 id 的时候如果没有更改,或复制不对,那么会发现没有执行

简单的解决方法是在打包的时候自动修改对应的文件包

先在项目文件的 build 文件夹里面添加 package.targets 和 package.props 文件,在项目文件添加下面代码进行输出

<None Include="build\package.targets" Pack="True" PackagePath="\build\$(PackageId).targets" />
<None Include="build\package.props" Pack="True" PackagePath="\build\$(PackageId).props" />

这样在输出的时候就会自动更改文件名

如果这个库文件只是需要添加资源文件,不需要加上 lib 文件,也就是不添加引用,那么请设置这个项目作为工具库

    <IsTool>true</IsTool>
<NoPackageAnalysis>true</NoPackageAnalysis>
<GeneratePackageOnBuild>true</GeneratePackageOnBuild>
<NoBuild>true</NoBuild>
<IncludeBuildOutput>false</IncludeBuildOutput>

通过 IsTool 将不会在安装的项目引用编译的文件

Roslyn 使用 Target 替换占位符方式生成 nuget 打包

如何编写基于 Microsoft.NET.Sdk 的跨平台的 MSBuild Target(附各种自带的 Task) - walterlv

如何创建一个基于 MSBuild Task 的跨平台的 NuGet 工具包 - walterlv

Roslyn 如何在 Target 引用 xaml 防止文件没有编译

Roslyn 通过 Target 修改编译的文件

2019-10-22-Roslyn-打包自定义的文件到-NuGet-包的更多相关文章

  1. Maven打包成Jar文件时依赖包的问题

    我们项目中使用到第三方的库文件,这些jar库文件并没有放到Maven中央库上,导致我们需要在项目中自己配置使用.我们的两三个开发人员对Java都是很熟,因此在使用中遇到了一些问题,表现在:在本地中引入 ...

  2. 使用批处理根据项目工程文件生成Nuget包并发布(支持.NET Core)

    最近在使用之前自己编写的批处理给.NET Core项目打包时出问题了,发现之前的脚本根本不适用了,折腾了半天,总算解决了.因此在这里分享下经验,并且奉上整理好的脚本. Nuget包这里就不多介绍了,需 ...

  3. 2019/10/22 test T1 题解

    题目描述 给定n个a[i],b[i],求min(x$\in$R){$\sum\limits_{i=1}^{n}$|a[i]*x+b[i]|} 输入格式 第 1行 1个整数 n第 2行 n个整数,第 i ...

  4. 2019.10.22 校内CSP%你赛

    我太难了 先说好没有代码T1 题目大意: 给定一些形如|ax+b|的式子,求最小的x使得它们的和最小. 算法一: 大家知道零点分段法 对于这n个式子我们有n+1个取值范围 使得展开这n个式子得到的新式 ...

  5. 2019.10.22 csp-s模拟测试82 反思总结

    重来重来,刚刚就当什么都没发生 今天的题属实有些迷惑,各种意义上…总之都很有难度吧.不满归不满,这套题的确不是什么没有意义的题目. 为了考验自己的学习能力记忆力,决定不写题解,扔个代码完事了 其实是懒 ...

  6. 2019.10.22 用TCP实现服务端并发接收

    client import socket client = socket.socket() client.connect( ('127.0.0.1',8888) ) while 1: msg = in ...

  7. 2019-11-29-Roslyn-打包自定义的文件到-NuGet-包

    title author date CreateTime categories Roslyn 打包自定义的文件到 NuGet 包 lindexi 2019-11-29 08:23:21 +0800 2 ...

  8. webpack中打包拷贝静态文件CopyWebpackPlugin插件

    copyWebpackPlugin: 作用:用于webpack打包时拷贝文件的插件包 安装:npm install copyWebpackPlugin@版本号 使用:// copy custom st ...

  9. 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器

    [源码下载] 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件保存选取器 示例1.演示如何 ...

随机推荐

  1. 循环读取文件夹中的图片matlab代码

    参考:http://blog.csdn.net/guoxiaojie_415/article/details/21317323:http://blog.csdn.net/qikaihuting/art ...

  2. import schedule ImportError: No module named schedule

    安装pip sudo apt-get install python-pip 安装schedule模块 pip install schedule PS: 如果已经安装pip,可能出现以下问题,按照提示重 ...

  3. A Simple Problem with Integers POJ - 3468 (线段树)

    思路:线段树,区间更新,区间查找 #include<iostream> #include<vector> #include<string> #include< ...

  4. Leetcode671.Second Minimum Node In a Binary Tree二叉树中的第二小结点

    给定一个非空特殊的二叉树,每个节点都是正数,并且每个节点的子节点数量只能为 2 或 0.如果一个节点有两个子节点的话,那么这个节点的值不大于它的子节点的值. 给出这样的一个二叉树,你需要输出所有节点中 ...

  5. mybatis添加数据返回主键

    程序结构图: 表结构: 创表sql: Create Table CREATE TABLE `users` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `us ...

  6. 转:VMware中CentOS配置静态IP进行网络访问(NAT方式和桥接模式)

    传送门:http://blog.csdn.net/zhangatle/article/details/77417310 其实这个博主的博客最是适合新手学习,踩过的坑让我再踩一踩,印象深刻 首先进行NA ...

  7. cmd 运行 python

    ①cmd 进入行命令: ②输入 “python” + “空格”,即 ”python “:将已经写好的脚本文件拖拽到当前光标位置,然后敲回车运行即可.

  8. JS---案例:拖曳对话框

    案例:拖曳对话框 ps: 实际没有要拖曳登录框的需求,只是演示拖曳的这个效果 1. 获取超链接,注册点击事件,显示登陆框和遮挡层 2. 获取关闭,注册点击事件,隐藏登陆框和遮挡层 3. 按下鼠标,移动 ...

  9. CAS小总结

      11                 if (log.isTraceEnabled()) { 12                     log.trace ("Logout requ ...

  10. HBuilderX生成本地打包App资源

    http://ask.dcloud.net.cn/question/60254 概要 在HBuilderX中开发的应用可以提交到云端打包生成apk(Android平台)和ipa(iOS平台).如果本地 ...