gpt4 book ai didi

msbuild - 防止 .NET Core 2.0 在 RHEL7 上将文件保留在/tmp 中

转载 作者:行者123 更新时间:2023-12-02 15:07:36 24 4
gpt4 key购买 nike

编辑:Martin 在下面提供了一个缺陷链接,该缺陷现已修复并发布。

我是一名大学生。我想在我的类(class)中使用 .NET Core。为此,我的代码需要在部门 Linux 集群上编译和运行,因为这是我的讲师测试我提交的内容的地方。

我的系统管理员为我安装了最近发布的 .NET Core 2.0 RHEL 软件包以进行试用。我创建、构建并运行了 sample CLI projects Microsoft provides ,他们工作了。但我的系统管理员很不高兴,因为 dotnet 在(全局)/tmp 中创建了至少一个文件,该文件在我注销后仍保留在那里。

-rw------- myuser mygroup /tmp/.NETCoreApp,Version=v2.0.AssemblyAttributes.cs

原则上,他不希望 dotnet/tmp 中创建任何在进程完成时不会清理的文件。不仅如此,当他尝试自己构建微软的样本时,却失败了; dotnet 尝试访问上述文件,但他的用户没有读取权限!

理想情况下,dotnet 不会创建任何生命周期与其正在构建的项目不同的文件。为了实现这一点,任何此类文件都可以位于项目目录中 - 可能位于 bin 子目录下,以便 clean 将清除它们。有没有办法让 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>

这会将其放入 IntermediateOutputPath这是 obj/{Debug/Release}/{TargetFramework}/ 。添加FileWrites项目允许在 dotnet clean 上对其进行清洁,这不是针对全局位置完成的,以避免清洁期间的竞争条件。

您可以创建 Directory.Build.targets文件位于您的用户目录/您的项目所在的目录层次结构中,以将目标连接到所有项目(除非它们尚未包含具有此名称的文件)。只需用 <Project> 包围目标即可该文件的元素。

有一个GitHub issue on changing the default location .

关于msbuild - 防止 .NET Core 2.0 在 RHEL7 上将文件保留在/tmp 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45950644/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com