1 MSBuild Task 利用 MSBuild Task, 可以在编译阶段,完成很多自定义的操作。比如最常见的,就是在编译完成之后,复制一些额外的文件到输出目录中。...}} 3.3 在目标项目中使用 Task 项目和目标项目在同一个大的仓库中,这里可以使用相对路径的方式直接引用。...> 解决方案中的 Assets 文件结构如下 这里有个注意点,Jgrass.GitHookMsbuildTask.targets 文件的名称,必须与 Jgrass.GitHookMsbuildTask...为 true, 使用 Import 直接导入相对路径下的 .targets 文件。...想法的源头来自这里:git 禁止大文件提交到仓库中 参考资料 团队项目利用Msbuild自定义Task实现增量发布 - Starup - 博客园 MSBuild入门(续) - Timetombs
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.
Microsoft.NET.Sdk.DefaultItems.Shared.targets(190,5): error NETSDK1022: 包含了重复的“Compile”项。....NET SDK 默认包含你项目目录中的“Compile”项。...可从项目文件中删除这些项;如果希望将其显式包含在项目文件中,可将“EnableDefaultCompileItems”属性设置为“false”。...”-- 无法找到文件 进入到 obj 文件夹下,去看 MyControl.g.cs 文件,可以看到开始的 #pragma checksum 记录的就是错误的相对路径 #pragma checksum "...,此时的记录应该是一个正确的相对路径或绝对路径,如下面代码所示才是正确的 #pragma checksum "..\..\..\..\..\..\..\..\..\..\..
.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,也可能是刻意如此。
---- “项目文件中的已知属性系列”分为两个部分: 本文:项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - 吕毅 项目文件中的已知 NuGet 属性(使用这些属性,创建...文件路径 项路径 写在 csproj 文件中 ItemGroup 组中的每一个元素即“项”。...对以下这一项进行说明的话: ItemGroup> ItemGroup> 那么,可用的属性有:...): MSBuild 程序所在的路径 $(MSBuildExtensionsPath): 自定义 targets 所在的路径 $(MSBuildExtensionsPath32): 自定义 targets...程序所在的路径 $(MSBuildBinPath): MSBuild 程序所在的路径 如果希望了解在 csproj 中创建 NuGet 包时可用的属性,请参考我的另一篇博客:项目文件中的已知 NuGet
MSBuild基本概念(续) 在上一篇简单的介绍了下MSBuild中的四个基本块,每块介绍比较单薄,在这里对在大多数的项目模版生成的*.*proj文件中比较常见一些用法和概念做些补充。...MSBuild项 项大都是用来引入文件用的,而文件会有一些附加信息,比如版本,语言等,而这些附加信息在项目文件中是以项的子元素的出现的,称为项的元数据。...,用来执行某一项逻辑处理,但是xml格式的项目文件是没有这个处理能力的,所以这些任务都是映射到.NET类库中的一些类,由这些类来处理操作中的逻辑。...Import元素像是一个占位元素,MSBuild在执行到此时会用*.targets替换掉此元素,就像本来就声明在这里一样,所以和*.targets文件有关的所有保留属性会被重置。...Import元素对导入文件的扩展名无要求,文件是正确的项目文件就行,但一般约定为*.targets。 总结和备注 了解了以上知识点后,阅读一般的项目模版生成的项目文件(*.
ItemGroup ItemGroup 是用来指定集合的地方,这与它的名字非常契合。那么这集合里面放什么项呢?答案是——什么都能放!...属性就是前面 PropertyGroup 中说的那些属性和 ItemGroup 里说的那些项;而 Targets 是新东西,这才是真正用来定义编译流程的关键,由于 Targets 是所有节点里面最复杂的部分..." /> 而引入的这份 .targets 文件便包含了 msbuild 定义的各种核心编译任务。...它帮我们导入了公共的属性、公共的编译任务,还帮我们自动将项目文件夹下所有的 **\*.cs 文件都作为 ItemGroup 的项引入进来。...随后根据 PropertyGroup 里面设置的属性正确显示属性面板中的状态,根据 ItemGroup 中的项正确显示解决方案管理器中的引用列表、文件列表。
> None 表示这一项要显示到 Visual Studio 解决方案中(其实对于不认识的文件,None 就是默认值);Include 表示相对于项目文件的路径(支持通配符);Pack 表示这一项要打包到...NuGet;PackagePath 表示这一项打包到 NuGet 中的路径。...我们在 buildMultiTargeting 文件夹里的 targets 文件中写以下内容,这样我们的注意力便可以集中在前面的 targets 文件中了。 targets 文件中的互相操作。...更多 MSBuild 全局参数,可以参考我的另一篇文章项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - 吕毅。
> None 表示这一项要显示到 Visual Studio 解决方案中(其实对于不认识的文件,None 就是默认值);Include 表示相对于项目文件的路径(支持通配符);Pack 表示这一项要打包到...NuGet;PackagePath 表示这一项打包到 NuGet 中的路径。...我们在 buildMultiTargeting 文件夹里的 targets 文件中写以下内容,这样我们的注意力便可以集中在前面的 targets 文件中了。 MSBuild 全局参数,可以参考我的另一篇文章项目文件中的已知属性(知道了这些,就不会随便在 csproj 中写死常量啦) - 吕毅。...有两种不同的方式: 直接传数据,这些数据可以被捕获成属性或者项,具体可以阅读我的另一篇博客: 如何使用 MSBuild Target(Exec)中的控制台输出 报告编译警告和编译错误,具体可以阅读我的另一篇博客
[原创]自定义VS2010项目文件vcxproj动态管理inc lib A guide to .vcxproj and .props file structure 基本框架 .vcxproj基本框架.../2003' > ItemGroup Label="ProjectConfigurations" /> msbuild/2003' > ItemGroup /> targets" /> <!
阅读 MSBuild.Sdk.Extras 来了解更多。 新 csproj 文件的优势与直观体验 如果你已经体验过新 csproj 文件的好处,那么直接前往下一节即可。没体验过的话就来体验一下吧!...从对比中我们就能明显看出新 csproj 文件的优势: 文件小,易读易写 在版本管理中更容易解冲突 NuGet 包的引用没有路径要求,这意味着开发者可以任意指定 NuGet 包的位置 嵌套的引用不需要重复指定...比如,你可能放入项目的不止有 cs 文件,还有其他各种用途的资源——你需要重新选中他们然后在属性面板中设置文件的生成属性。..." SubType="Designer" Generator="MSBuild:Compile" /> ItemGroup> 如果这只是一个简单的 WPF/UWP 类库,那么这些节点其实就足够了。...其实这是只有新的项目文件才会出现的编译错误,而错误原因是 NuGet 的缓存文件中与包引用相关的信息已经不正确了,需要运行 nuget restore 或者 dotnet restore 重新更新此文件才行
请点击 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
\src\Crust\Gimela.Crust.sln" /> ItemGroup> MSBuild Projects="@(ProjectToBuild)" Targets...这里还需要强调一点的是,项目级元素(Property)可以在元素下定义,也可以在构造过程中作为外部参数传入,这是一个非常有用的特性,一般编译时选择配置项(Debug或者Release)就是利用这个特性实现的...Project元素 这是每一个项目文件的最外层元素,它表示了一个项目的范围。如果缺少了这一元素,MSBuild会报错称Target元素无法识别或不被支持。...我们都知道,在一个项目的生成过程中可能需要完成几项不同的任务(比如编译、单元测试、check-in到源代码控制服务器中等),其中每一项任务都可以用Target来表示。...可千万别和Property的引用方法弄混了。 既然Type是资源的类名,那么Include就是具体的资源名称了,比如在上面的示例代码中,Include引用的就是C#源代码文件的名称。
修复错误 找出原因 要了解问题到底出在哪里了,我们需要知道 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,这是为了在生成临时项目文件时使用正确的编译项的名称。
我在之前的博客中有教大家如何编写 NuGet 工具包,其中就有编写 .targets 文件。...这是一个 .targets 文件,项目安装此 NuGet 包之后就会自动 Import 这个 targets 文件。...在编译期间,执行一个私有的 Target,收集所有收集到的文件夹,形成一个 SourceFusionDirectory 集合。然后将集合中的所有字符串视为文件夹,创建这几个文件夹。...在新的有 Sdk 的 csproj 中,这个 targets 文件的执行没有问题。但是,对于旧的 csproj 来说,就经常出现这几个属性为空或者部分为空的情况。...原因 究其原因,这是 MSBuild 对项目文件(csproj)的解析和 Visual Studio 对项目文件的解析是不同的。
那么,除非我在 B 包安装完之后,明确在 B 的 csproj 文件中写以下代码,否则 B 包发布出去后,安装 B 包的项目 C 就会同时安装上 A 包。...属性,可以在 nuspec 文件中写。...ItemGroup> 为了通用一点,我取名为 Package.targets 文件,并在 A 项目编译的时候改名为 Walterlv.PackageDemo.A.targets...▲ 项目的结构 以下是 A 项目的 csproj 文件,包含将 Package.targets 在打包 NuGet 包时改名的部分。...另外,我还尝试将 Package.targets 中的所有内容放到 里面以获得延迟到编译期执行的效果,但结论依然与上面一致,即仅能在 Visual Studio 中正常工作。
库的 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 文件夹的
但是,现在 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 能引用
一、缘由 当创建 .NET Core/Standard 2.0项目时,VS不会像.NET Framework项目一样自动生成AssemblyInfo.cs文件。...而且,若是手工在项目中加入以前写好的 AssemblyInfo.cs 文件,编译时会报告“CS0579: Duplicate 'AssemblyFileVersionAttribute' attribute...我们的 AssemblyInfo.cs 中也使用 AssemblyFileVersionAttribute 等特性。...上面这段自动生成的代码,实际上是由 c:\Program Files\dotnet\sdk\2.0.0\Sdks\Microsoft.NET.Sdk\build\Microsoft.NET.GenerateAssemblyInfo.targets...该文件的内容是—— <!
领取专属 10元无门槛券
手把手带您无忧上云