Noa*_*oah 3 msbuild rhel csproj .net-core
我是一名大学生。我想在我的课程中使用 .NET Core。为此,我的代码需要在部门 Linux 集群上编译和运行,因为这是我的导师测试我提交的内容。
我的系统管理员在试用的基础上为我安装了最近发布的 .NET Core 2.0 RHEL 包。我创建、构建并运行了Microsoft 提供的示例 CLI 项目,并且它们运行良好。但是我的系统管理员很不高兴,因为dotnet在(全局)/tmp 中创建了至少一个文件,在我注销后它仍然存在。
-rw------- myuser mygroup /tmp/.NETCoreApp,Version=v2.0.AssemblyAttributes.cs
Run Code Online (Sandbox Code Playgroud)
原则上,他不希望dotnet在/tmp中创建任何在其进程完成后不会清理的文件。更重要的是,当他试图自己构建微软的样本时,它失败了;dotnet试图访问上述文件,他的用户没有读取权限!
理想情况下,dotnet不会创建任何生命周期与其正在构建的项目不同的文件。为了实现这一点,任何这样的文件都可以存在于项目目录中——可能在bin子目录下,以便 aclean将清除它们。有没有办法让dotnet这些文件写在那里?否则,它是否可以至少使用临时文件名,以避免我们遇到的权限冲突?
无论解决方案是什么,它都必须是全系统的,不能依赖于用户的良好行为。所以像要求用户设置$TMPDIR这样的事情是行不通的。
最简单的方法是将TMPDIR环境变量设置为不同的位置,因为 MSBuild 使用它来构造路径。
使 msbuild 使用此文件的本地路径的另一种方法是将这样的目标添加到 csproj 文件中:
<Target Name="SetTFMAssemblyAttributesPath"
BeforeTargets="GenerateTargetFrameworkMonikerAttribute">
<PropertyGroup>
<TargetFrameworkMonikerAssemblyAttributesPath>$(IntermediateOutputPath)$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)</TargetFrameworkMonikerAssemblyAttributesPath>
</PropertyGroup>
<ItemGroup>
<!-- GenerateTargetFrameworkMonikerAttribute doesn't add to @(FileWrites) for the global path -->
<FileWrites Include="$(TargetFrameworkMonikerAssemblyAttributesPath)" />
</ItemGroup>
</Target>
Run Code Online (Sandbox Code Playgroud)
这会将其放入IntermediateOutputPathwhich is 中obj/{Debug/Release}/{TargetFramework}/。添加的FileWrites项目允许它在 上进行清理dotnet clean,这不是针对全局位置进行的,以避免在清理过程中出现竞争条件。
您可以Directory.Build.targets在您的用户目录/项目所在的目录层次结构中创建一个文件,以将目标连接到所有项目(除非它们尚未包含具有此名称的文件)。只需使用<Project>此文件的元素包围目标。
| 归档时间: |
|
| 查看次数: |
510 次 |
| 最近记录: |