首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

.NET 项目自定义 MSBuild Task

1 MSBuild Task 利用 MSBuild Task, 可以在编译阶段,完成很多自定义的操作。比如最常见的,就是在编译完成之后,复制一些额外的文件到输出目录中。...}} 3.3 在目标项目中使用 Task 项目和目标项目在同一个大的仓库中,这里可以使用相对路径的方式直接引用。...> 解决方案中的 Assets 文件结构如下 这里有个注意点,Jgrass.GitHookMsbuildTask.targets 文件的名称,必须与 Jgrass.GitHookMsbuildTask...为 true, 使用 Import 直接导入相对路径下的 .targets 文件。...想法的源头来自这里:git 禁止大文件提交到仓库中 参考资料 团队项目利用Msbuild自定义Task实现增量发布 - Starup - 博客园 MSBuild入门(续) - Timetombs

8510

.NET魔法堂:工程构建基石->MSBuild

VS中右键打开项目菜单, ? 对应MSBuild的Build目标, ? 对应MSBuild的Rebuild目标, ? 对应MSBuild的Clean目标, ?...执行引擎中内置部分预定义的Item,具体如下: image.png MSBuild执行引擎中为每个Item预设的元数据,具体如下: 元数据名 元数据说明 FullPath 当前项所指向的文件的绝对路径...RootDir 当前项所指向的文件的根目录 Filename 当前项所指向的文件的不含扩展名的名称 Extension 当前项所指向的文件的扩展名 RelativeDir 当前项所指向的文件的相对路径(...以\为结尾) Directory 当前项所指向的文件的目录(以\为结尾) RecursiveDir 当项的Include中包含**,则存放**匹配到的目录路径 Identity %(RelativeDir...Import元素    作用:将另一个项目文件导入到当前的项目文件    属性: 属性名 说明 Project 项目文件的绝对或相对路径 1. 相对路径,是相对于当前项目文件的路径而言; 2.

2K80
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    在项目文件 MSBuild NuGet 包中编写扩展编译的时候,正确使用 props 文件和 targets 文件

    .NET 扩展编译用的文件有 .props 文件和 .targets 文件。不给我选择还好,给了我选择之后我应该使用哪个文件来编写扩展编译的代码呢?...如果你不了解 .props 文件或者 .targets 文件,可以阅读下面的博客: 理解 C# 项目 csproj 文件格式的本质和编译流程 - walterlv 具体的例子有下面这些博客。...工具包 - walterlv 如何创建一个基于命令行工具的跨平台的 NuGet 工具包 - walterlv 当我们创建的 NuGet 包中包含 .props 和 .targets 文件的时候,我们相当于在项目文件...-- 当生成 WPF 临时项目时,不会自动 Import NuGet 中的 props 和 targets 文件,这使得在临时项目中你现在看到的整个文件都不会参与编译。...WPF 临时项目不会 Import NuGet 中的 props 和 targets 可能是 WPF 的 Bug,也可能是刻意如此。

    27820

    项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦)

    ---- “项目文件中的已知属性系列”分为两个部分: 本文:项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - 吕毅 项目文件中的已知 NuGet 属性(使用这些属性,创建...文件路径 项路径 写在 csproj 文件中 ItemGroup 组中的每一个元素即“项”。...对以下这一项进行说明的话: ItemGroup> ItemGroup> 那么,可用的属性有:...): MSBuild 程序所在的路径 $(MSBuildExtensionsPath): 自定义 targets 所在的路径 $(MSBuildExtensionsPath32): 自定义 targets...程序所在的路径 $(MSBuildBinPath): MSBuild 程序所在的路径 如果希望了解在 csproj 中创建 NuGet 包时可用的属性,请参考我的另一篇博客:项目文件中的已知 NuGet

    1.6K10

    MSBuild入门(续)

    MSBuild基本概念(续) 在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见一些用法和概念做些补充。...MSBuild项 项大都是用来引入文件用的,而文件会有一些附加信息,比如版本,语言等,而这些附加信息在项目文件中是以项的子元素的出现的,称为项的元数据。...,用来执行某一项逻辑处理,但是xml格式的项目文件是没有这个处理能力的,所以这些任务都是映射到.NET类库中的一些类,由这些类来处理操作中的逻辑。...Import元素像是一个占位元素,MSBuild在执行到此时会用*.targets替换掉此元素,就像本来就声明在这里一样,所以和*.targets文件有关的所有保留属性会被重置。...Import元素对导入文件的扩展名无要求,文件是正确的项目文件就行,但一般约定为*.targets。 总结和备注 了解了以上知识点后,阅读一般的项目模版生成的项目文件(*.

    97690

    理解 C# 项目 csproj 文件格式的本质和编译流程

    ItemGroup ItemGroup 是用来指定集合的地方,这与它的名字非常契合。那么这集合里面放什么项呢?答案是——什么都能放!...属性就是前面 PropertyGroup 中说的那些属性和 ItemGroup 里说的那些项;而 Targets 是新东西,这才是真正用来定义编译流程的关键,由于 Targets 是所有节点里面最复杂的部分..." /> 而引入的这份 .targets 文件便包含了 msbuild 定义的各种核心编译任务。...它帮我们导入了公共的属性、公共的编译任务,还帮我们自动将项目文件夹下所有的 **\*.cs 文件都作为 ItemGroup 的项引入进来。...随后根据 PropertyGroup 里面设置的属性正确显示属性面板中的状态,根据 ItemGroup 中的项正确显示解决方案管理器中的引用列表、文件列表。

    2.6K10

    如何创建一个基于命令行工具的跨平台的 NuGet 工具包

    > None 表示这一项要显示到 Visual Studio 解决方案中(其实对于不认识的文件,None 就是默认值);Include 表示相对于项目文件的路径(支持通配符);Pack 表示这一项要打包到...NuGet;PackagePath 表示这一项打包到 NuGet 中的路径。...我们在 buildMultiTargeting 文件夹里的 targets 文件中写以下内容,这样我们的注意力便可以集中在前面的 targets 文件中了。 MSBuild 全局参数,可以参考我的另一篇文章项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - 吕毅。...有两种不同的方式: 直接传数据,这些数据可以被捕获成属性或者项,具体可以阅读我的另一篇博客: 如何使用 MSBuild Target(Exec)中的控制台输出 报告编译警告和编译错误,具体可以阅读我的另一篇博客

    1K20

    将 WPF、UWP 以及其他各种类型的旧 csproj 迁移成基于 Microsoft.NET.Sdk 的新 csproj

    阅读 MSBuild.Sdk.Extras 来了解更多。 新 csproj 文件的优势与直观体验 如果你已经体验过新 csproj 文件的好处,那么直接前往下一节即可。没体验过的话就来体验一下吧!...从对比中我们就能明显看出新 csproj 文件的优势: 文件小,易读易写 在版本管理中更容易解冲突 NuGet 包的引用没有路径要求,这意味着开发者可以任意指定 NuGet 包的位置 嵌套的引用不需要重复指定...比如,你可能放入项目的不止有 cs 文件,还有其他各种用途的资源——你需要重新选中他们然后在属性面板中设置文件的生成属性。..." SubType="Designer" Generator="MSBuild:Compile" /> ItemGroup> 如果这只是一个简单的 WPF/UWP 类库,那么这些节点其实就足够了。...其实这是只有新的项目文件才会出现的编译错误,而错误原因是 NuGet 的缓存文件中与包引用相关的信息已经不正确了,需要运行 nuget restore 或者 dotnet restore 重新更新此文件才行

    1.5K20

    WPF 讲讲 Microsoft.NET.Sdk.WindowsDesktop 的原理

    请点击 github 打开,我特意用了一个commit的链接,因为可能后续文件路径会修改 这个 SDK 包含了两部分,一个是 Sdk 另一个是 targets 文件夹 打开 SDK 文件夹里面,可以 Sdk.props...和 Sdk.targets 两个文件,实际上这两个文件的实际作用就是被 VisualStudio 或 dotnet 的构建器发现,而核心逻辑都是通过 Import 引用 targets 文件夹里面的代码...)\Microsoft.NET.Sdk.WindowsDesktop.targets "/> 下面就来聊聊 targets 文件夹里面的内容,在这个文件夹里面包含了 xx.targets...按照编译器约定,其中的 props 文件用来定义属性,而 targets 文件用来定义执行逻辑 下面从 props 文件开始讲,在 Microsoft.NET.Sdk.WindowsDesktop.props...在 targets 文件里面主要是用来更改构建步骤的,功能如下 移除重复的页面引用 提示构建项重复 提示 SDK 版本警告 移除重复的页面引用,需要移除页面里面引用的 @(Resource);@(Content

    1.5K10

    MSBuild的简单介绍与使用

    \src\Crust\Gimela.Crust.sln" /> ItemGroup> MSBuild Projects="@(ProjectToBuild)" Targets...这里还需要强调一点的是,项目级元素(Property)可以在元素下定义,也可以在构造过程中作为外部参数传入,这是一个非常有用的特性,一般编译时选择配置项(Debug或者Release)就是利用这个特性实现的...Project元素 这是每一个项目文件的最外层元素,它表示了一个项目的范围。如果缺少了这一元素,MSBuild会报错称Target元素无法识别或不被支持。...我们都知道,在一个项目的生成过程中可能需要完成几项不同的任务(比如编译、单元测试、check-in到源代码控制服务器中等),其中每一项任务都可以用Target来表示。...可千万别和Property的引用方法弄混了。 既然Type是资源的类名,那么Include就是具体的资源名称了,比如在上面的示例代码中,Include引用的就是C#源代码文件的名称。

    1.3K50

    制作通过 NuGet 分发的源代码包时,如果目标项目是 WPF 则会出现一些问题(探索篇,含解决方案)

    修复错误 找出原因 要了解问题到底出在哪里了,我们需要知道 WPF 究竟在编译过程中做了哪些额外的事情。WPF 额外的编译任务主要在 Microsoft.WinFX.targets 文件中。...包中自动 Import 的部分没有加入到依赖项中,所以实际上包中的 .props 和 .targets 文件都不会被 Import 进来,这可能造成部分 NuGet 包在 WPF 项目中不能正常工作。...这是通过 NuGet 包中的 .targets 文件中的内容,用来强行替换: 1 2 3 4 5 6 7 8 9 10 文件时使用正确的引用路径项的名称。...CompileTypeName,传入了字符串常量 Compile,这是为了在生成临时项目文件时使用正确的编译项的名称。

    49040

    Visual Studio 2017 以前的旧格式的 csproj Import 进来的 targets 文件有时不能正确计算属性(PropertyGroup)和集合(ItemGroup)

    我在之前的博客中有教大家如何编写 NuGet 工具包,其中就有编写 .targets 文件。...这是一个 .targets 文件,项目安装此 NuGet 包之后就会自动 Import 这个 targets 文件。...在编译期间,执行一个私有的 Target,收集所有收集到的文件夹,形成一个 SourceFusionDirectory 集合。然后将集合中的所有字符串视为文件夹,创建这几个文件夹。...在新的有 Sdk 的 csproj 中,这个 targets 文件的执行没有问题。但是,对于旧的 csproj 来说,就经常出现这几个属性为空或者部分为空的情况。...原因 究其原因,这是 MSBuild 对项目文件(csproj)的解析和 Visual Studio 对项目文件的解析是不同的。

    21930

    Roslyn 通过 NuGet 库修改应用程序入口函数

    库的 id .targets 文件,如我这里的是 lindexi 就创建 lindexi.targets 文件,此时看到的文件夹如下 │ .nupkg.metadata │ lindexi.1.0.0...└─services │ └─metadata │ └─core-properties └─_rels 在 lindexi.targets 文件里面可以尝试添加代码,在测试的项目每次都需要运行...git clean -xdf 清理之后才可以使用 dotnet run 运行,这样就可以减少打包 在 targets 文件里面写的内容,只需要下一次在测试项目使用 dotnet run 就会使用 先通过...WriteLinesToFile写一个新的文件,这个文件里面包括主函数 然后在 StartupObject 指定入口函数为刚才创建的文件 在 targets 文件定义临时文件的存放的路径 文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - walterlv 上面代码是定义路径是 obj 文件夹的

    50910

    三种方法设置 .NETC# 项目的编译顺序,而不影响项目之间的引用

    但是,现在 B 项目可能仅仅只是一个工具项目,或者说 A 项目编译之后的程序集并不需要 B,仅仅只是将 B 打到一个包中,那么我们其实需要的仅仅是 B 项目先编译而已。...ReferenceOutputAssembly 解决方案依赖 MSBuild 编译任务 位置 项目文件(csproj)或编译文件(*.props / *.targets) 解决方案文件(sln) 项目文件...(csproj)或编译文件(*.props / *.targets) 编译项目 ✔️生效 ❌无效 ✔️生效 编译解决方案 ✔️生效 ✔️生效 ✔️生效 拷贝依赖项目的输出文件 否 ⚠是 否 要求匹配目标框架...) 位置:代码可以写到哪些文件中 编译项目:使用 dotnet build 或者 msbuild 命令来编译时,传入项目文件 编译解决方案:使用 dotnet build 或者 msbuild 命令来编译时...,传入解决方案文件 拷贝依赖项目的输出文件:如果 A 项目引用 B 项目,那么 B 项目的输出文件会被自动拷贝到 A 项目的输出目录中 要求匹配目标框架:必须匹配的框架才能引用,例如 net48 能引用

    69420
    领券