c# - 如何根据输入文件过时执行 msbuild (csproj) 目标
问题描述
我需要在我的 csproj 文件中添加一个目标,该文件指定输入文件和输出文件。通过此链接,我尝试像这样定义我的目标:
<ItemGroup>
<ins Include="A.txt" />
<outs Include="B.txt" />
</ItemGroup>
<Target Name="ExecuteTarget" Inputs="@(ins)" Outputs="@(outs)">
<Exec Command="echo hello world" />
</Target>
此处的目的是当且仅当文件 A.txt 比 B.txt 更新或 B.txt 不存在时,每次在 VS IDE 中构建 csproj 时,在 Visual Studio 输出窗口中回显 hello world。A.txt 和 B.txt 都存在于与 csproj 文件相同的目录中。
但是,这似乎不起作用,因为当我构建这个 csproj 时,我无法在输出窗口中打印字符串“hello world”。我正在使用 VS 16.11.5 和启用 .NET 5.0 的 csproj (WinUI)。
任何帮助/想法/建议将不胜感激。
解决方案
必须在某处调用目标,仅具有输入和输出是不够的。有几种方法可以做到这一点:用 显式调用它CallTarget
,或者让它成为另一个目标的依赖项(所以另一个被调用的目标 has Dependencies="ExecuteTarget"
),或者 useAfterTargets
等等。
例如<Target Name="ExecuteTarget" Inputs="@(ins)" Outputs="@(outs)" AfterTargets="CoreCompile">
应该这样做,如果 B.txt 存在并且比 A.txt 更新,则将跳过目标。不过,我建议为目标使用更有意义的名称。
推荐阅读
- javascript - 在反应中创建倒计时
- javascript - 电影循环中的 PHP/HTML 评级系统
- python - 根据以新值重新启动的差异创建新列
- python - Locust.io 顺序任务集未按顺序运行
- laravel - 在 AWS S3 上获取文件而不使用 Laravel 公开存储桶
- javascript - React 中 axios 的未知“网络错误”
- google-chrome - 为什么即使存在缓存控制标头,Chrome 也不缓存响应?
- vue.js - 我可以使用 Vue.Draggable 从操作系统中拖动文件吗?
- javascript - 如何在一个数组中找到连续多少次相同的值?
- docker - Docker-Compose:cap_drop 和 cap_add 的顺序?