Msbuild 防止.NET Core 2.0将文件留在RHEL7上的/tmp中

Msbuild 防止.NET Core 2.0将文件留在RHEL7上的/tmp中,msbuild,.net-core,rhel,csproj,Msbuild,.net Core,Rhel,Csproj,我是一名大学生。我想在我的课程作业中使用.NET Core。要做到这一点,我的代码需要在department Linux集群上编译和运行,因为这是我的讲师测试我提交的内容的基础 我的系统管理员在试用的基础上为我安装了最近发布的.NET Core 2.0 RHEL包。我创建、建造和运行了这个系统,它们工作了。但是我的系统管理员很不高兴,因为dotnet在(全局)/tmp中创建了至少一个文件,在我注销后仍保留在那里 -rw------- myuser mygroup /tmp/.NETCoreApp

我是一名大学生。我想在我的课程作业中使用.NET Core。要做到这一点,我的代码需要在department Linux集群上编译和运行,因为这是我的讲师测试我提交的内容的基础

我的系统管理员在试用的基础上为我安装了最近发布的.NET Core 2.0 RHEL包。我创建、建造和运行了这个系统,它们工作了。但是我的系统管理员很不高兴,因为
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)$(TargetFrameworkMoniker).AssemblyAttributes$(DefaultLanguageSourceExtension)
这将把它放入
intermediateOutput路径
,即
obj/{Debug/Release}/{TargetFramework}/
。添加的
FileWrites
项允许在
dotnet clean
上对其进行清理,这对于全局位置来说是不允许的,以避免清理期间出现争用情况

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


有一个。

谢谢,很高兴知道这一点——尽管我确实希望能找到一个不依赖于用户规范的解决方案。是的,这是一个永久性的解决方案。我在相关的GitHub问题上链接了它(我将把它添加到答案中)。添加了一个
目录的建议。Build.targets
,将此逻辑添加到您所从事的所有项目中。如果答案对你有用,请考虑接受答案。这是.NET中的用户设置,位于用户主目录下的文件中。这听起来很合理,但它解决了像我们这样的多用户机构系统的问题吗?我的管理员需要它作为所有当前和未来用户的系统默认设置。我认为这样的文件不能达到这个目的。管理员很难强迫它存在那里,用户很容易删除它——而且大多数用户都不需要它,因为不是每个人都使用.NET。一个Linux环境变量(而不是$TMPDIR)可以工作,或者在global/etc.Got下有一个可选的配置文件。谢谢你的努力,马丁。如果你认为我的建议会受到欢迎的话,我会补充我对生长激素问题的建议解决方案。