首先,我是npm和grunt的新手.我们有一个项目,我们正在使用Grunt来编译和生成输出文件.我正在尝试设置我们的构建服务器以使用Grunt生成输出文件.我们正在使用带有TFS源代码控制的Windows,并且由于它有260个字符的路径限制,我们无法将grunt-bower-task模块检查到源代码控制中(因为它在其安装路径中仅使用230个字符).
当我从我的项目目录运行npm install时,它工作正常,并将以下必需的模块安装到我的项目目录中的node_modules文件夹中:
然后当我从我的项目目录运行grunt deploy时,一切都按预期工作.
虽然我可以简单地运行npm install部分构建过程,但我不愿意,因为下载所有文件需要几分钟,而且我不希望我们的构建依赖于可用的外部Web服务.
我已经看到你可以在本地或全局安装模块,所以我希望能够在构建服务器上全局安装模块,这样它们就不需要直接在项目目录中的node_modules文件夹中.运行grunt部署.我为上面列出的每个模块运行了npm install -g,以及npm install -g [module],以及npm install -g grunt-cli.
如果我执行npm前缀-g,它会告诉我全局模块目录是C:\ Users [我的用户]\AppData\Roaming \npm,当我查看该目录的node_modules文件夹时,我确实看到了所有模块.但是,当我运行grunt deploy时,它抱怨:
致命错误:无法找到当地的咕噜声
如果我只包含*node_modules\grunt*目录,那么我仍然会收到以下错误:
找不到本地Npm模块"grunt-contrib-watch".它安装了吗?
找不到本地Npm模块"grunt-contrib-jshint".它安装了吗?
...
我也尝试使用*grunt deploy --base"C:\ Users [我的用户]\AppData\Roaming \npm",但它抱怨说它找不到其他文件,例如.jshintrc.
那么有没有办法让我可以运行grunt deploy并让它检查模块的npm全局前缀路径,而不是查看项目目录?
一个hacky的工作是在构建过程中手动将模块复制到本地项目目录,但我想尽可能避免这种情况.
作为参考,这是我的package.json文件的样子:
{
"name": "MyProject",
"version": "0.0.1", …Run Code Online (Sandbox Code Playgroud) 我正在使用PowerShell v3和Windows PowerShell ISE.我有以下功能正常工作:
function Get-XmlNode([xml]$XmlDocument, [string]$NodePath, [string]$NamespaceURI = "", [string]$NodeSeparatorCharacter = '.')
{
# If a Namespace URI was not given, use the Xml document's default namespace.
if ([string]::IsNullOrEmpty($NamespaceURI)) { $NamespaceURI = $XmlDocument.DocumentElement.NamespaceURI }
# In order for SelectSingleNode() to actually work, we need to use the fully qualified node path along with an Xml Namespace Manager, so set them up.
[System.Xml.XmlNamespaceManager]$xmlNsManager = New-Object System.Xml.XmlNamespaceManager($XmlDocument.NameTable)
$xmlNsManager.AddNamespace("ns", $NamespaceURI)
[string]$fullyQualifiedNodePath = Get-FullyQualifiedXmlNodePath -NodePath $NodePath -NodeSeparatorCharacter $NodeSeparatorCharacter
# Try and get the …Run Code Online (Sandbox Code Playgroud) powershell function return-type powershell-ise powershell-3.0
在 Windows 窗体和 WPF 应用程序中,我们可以使用设置设计器文件来保存用户特定的设置。该文档仅提到 .Net Framework(例如 1 - 4),而不是 .Net Core 或 .Net(例如 5+)。我已经确认 .settings 格式和设计器仍然可以在使用 Visual Studio 2022 的 Windows 上的 .Net 6 WPF 中工作。
我的问题是,文件格式和设计器仍然是.Net MAUI.settings应用程序的推荐方法吗?它可以在所有平台(Windows、macOS、移动设备)上运行吗?如果没有,建议的方法是简单地编写自己的自定义文件来保存用户设置,如果是,该文件应该写入哪里?/ , 或者别的地方?Environment.SpecialFolder.ApplicationDataEnvironment.SpecialFolder.LocalApplicationData
我正在编写一个C#.Net 4.5库,用于执行常见的SQL数据库操作(备份,恢复,执行脚本等).我希望每个操作都有同步和异步函数,因为这个库将由控制台和GUI应用程序使用,但我不想在任何地方重复代码.所以我看到它,我有两个选择:
编写在同步函数中执行工作的代码,然后将其包装在async函数的任务中,如下所示:
public void BackupDB(string server, string db)
{
// Do all of the work and long running operation here
}
public async Task BackupDBAsync(string server, string db)
{
await Task.Factory.StartNew(() => BackupDB(server, db)).ConfigureAwait(false);
}
Run Code Online (Sandbox Code Playgroud)编写在异步函数中执行工作的代码,并使用.Wait()从同步函数中调用它:
public async Task BackupDBAsync(string server, string db)
{
// Do all of the work and long running operation here, asynchronously.
}
public void BackupDB(string server, string db)
{
BackupDBAsync(server, db).Wait(); // Execution will wait here until async function finishes completely.
}
Run Code Online (Sandbox Code Playgroud)一种选择比另一种更好吗?这是一个最佳实践吗?或者还有其他(更好的)替代方案吗?
我知道使用.Wait()的一个警告是async函数中的所有await语句都必须使用.ConfigureAwait(false)来避免死锁( …
举个简单的例子,假设我有一个文件夹Root,里面有三个文件夹; Folder1,Folder2和Folder3.这些文件夹(包括Root)中的每一个都包含一堆文件,包括.pdb文件.我想使用PowerShell Get-ChildItem cmdlet返回所有文件夹(包括Root)中的所有文件,但Folder2中的.pdb文件除外.如果我使用:
Get-ChildItem -Path C:\Root -Recurse -Exclude *.pdb
Run Code Online (Sandbox Code Playgroud)
然后我回到所有目录中的所有非.pdb文件,这接近我想要的.所以我假设以下内容将实现我想要的:
Get-ChildItem -Path C:\Root -Recurse -Exclude \*\\Folder2\\*.pdb
Run Code Online (Sandbox Code Playgroud)
但这并不排除Folder2(或任何其他文件夹)中的任何pdb文件.我已经为-Exclude过滤器尝试了几种变体,例如Folder2\\\*.pdb,但我无法让它工作.事实上,即使使用\*\\\*.pdb似乎也没有做任何事情; 没有.pdb文件从任何文件夹中排除.
所以似乎通配符不能用于目录,只能用于文件名,但我认为我只是做错了.我发现这篇文章解释了通配符和范围操作符,但不幸的是它没有讨论将它们与目录名一起使用; 只有文件名.
我正在写一个脚本从GitHub下载几个存储库.以下是下载存储库的命令:
git clone "$RepositoryUrl" "$localRepoDirectory"
Run Code Online (Sandbox Code Playgroud)
当我运行此命令时,它会在我想要显示的控制台窗口中显示一些很好的进度信息.
问题是我还希望能够检测下载时是否发生任何错误.我发现这篇文章谈到重定向各种流,所以我试过:
(git clone "$RepositoryUrl" "$localRepoDirectory") 2> $errorLogFilePath
Run Code Online (Sandbox Code Playgroud)
这会将stderr中的任何错误传递给我的文件,但不再在控制台中显示好的进度信息.
我可以这样使用Tee-Object:
(git clone "$RepositoryUrl" "$localRepoDirectory") | Tee-Object -FilePath $errorLogFilePath
Run Code Online (Sandbox Code Playgroud)
我仍然得到了很好的进度输出,但是这会将stdout传递给文件,而不是stderr; 我只关心检测错误.
有没有办法可以存储文件或(最好)变量中发生的任何错误,同时还有进度信息传递到控制台窗口?我有一种感觉,答案可能在于将各种流重定向到其他流中,如本文中的讨论,但我不太确定.
========更新=======
我不确定git.exe是否与典型的可执行文件不同,但我已经做了一些测试,这是我发现的:
$output = (git clone "$RepositoryUrl" "$localRepoDirectory")
Run Code Online (Sandbox Code Playgroud)
$ output始终包含文本"Cloning into'[localRepoDirectory]'...",无论命令是成功完成还是产生错误.此外,执行此操作时,仍会将进度信息写入控制台.这让我认为进度信息不是通过stdout写的,而是通过其他一些流写的?
如果发生错误,则错误将写入控制台,但采用通常的白色前景色,不是典型的红色表示错误,黄色表示警告.当从cmdlet函数中调用此函数并且命令因错误而失败时,错误不会通过函数的-ErrorVariable(或-WarningVariable)参数返回(但是,如果我执行自己的Write-Error,则会通过-ErrorVariable返回).这让我觉得git.exe没有写入stderr,但是当我们这样做时:
(git clone "$RepositoryUrl" "$localRepoDirectory") 2> $errorLogFilePath
Run Code Online (Sandbox Code Playgroud)
错误消息被写入文件,这使我认为它写入stderr.所以现在我很困惑......
========更新2 =======
因此,在Byron的帮助下,我尝试了一些使用新流程的解决方案,但仍然无法获得我想要的东西.使用新进程时,我永远无法将好的进度写入控制台.
我尝试过的三种新方法都使用了这个共同的代码:
$process = New-Object System.Diagnostics.Process
$process.StartInfo.Arguments = "clone ""$RepositoryUrl"" ""$localRepoDirectory"""
$process.StartInfo.UseShellExecute = $false
$process.StartInfo.RedirectStandardOutput = $true
$process.StartInfo.RedirectStandardError = $true
$process.StartInfo.CreateNoWindow = $true
$process.StartInfo.WorkingDirectory = $WORKING_DIRECTORY
$process.StartInfo.FileName = "git" …Run Code Online (Sandbox Code Playgroud) 我在我们的TFS构建服务器上安装了npm和grunt.我使用npm install -g grunt-cli安装了grunt-cli,然后在以我自己的身份登录时能够从命令行运行grunt deploy.
Out TFS版本作为tfsservice用户运行,当它尝试执行grunt部署时,它会收到一条错误消息:
'grunt' is not recognized as an internal or external command, operable program or batch file.
Run Code Online (Sandbox Code Playgroud)
所以,当我在构建服务器上以我自己的身份登录时,如果我将命令提示符作为tfsservice运行,我会得到相同的错误.所以我尝试从命令提示符下执行npm install -g grunt-cli,它看起来已经正确安装并在C:\ Users\tfsservice\AppData\Roaming \npm中创建了grunt文件,但是后来我仍然得到了同样的错误当运行grunt部署时.
所以看起来grunt-cli没有为tfsservice安装?当我得到tfsservice%homepath%时,我看到它被设置为\ Windows\system32,而不是预期的\ Users\tfsservice ; 也许这是一个服务帐户与它有关?
我看到类似的问题已被要求在团队城市中使用grunt-cli,但它建议使用Team City特定的插件.
还有这篇帖子说他们改变了Team City作为一个不同的用户运行,然后一切都开始正常工作.尽管如此,将我们的构建更改为以不同于tfsservice的用户身份运行并不是一个真正的选择.
任何建议表示赞赏.谢谢.
我有一个编辑注册表的PowerShell脚本,所以它需要以管理员身份运行.为此,我从运行的PowerShell脚本启动一个新的PowerShell进程,并使用带有函数的脚本块传递部分注册表键路径.当我在该函数中使用双引号时,PowerShell会尝试将它们解释为命令,而不是字符串.如果我使用单引号,那么一切正常.
我创建了一个简单的样本PowerShell脚本来重现问题.这是片段:
$ScriptBlock = {
function Test
{
$status = "This is a string"
Write-Output $status
}
}
Start-Process -FilePath PowerShell -ArgumentList "-NoExit -NoProfile -ExecutionPolicy Bypass -Command & {$ScriptBlock Test}"
Run Code Online (Sandbox Code Playgroud)
因此,在新的PowerShell流程中,它将首先在脚本块中定义代码,然后调用Test方法,并产生以下错误:
这:术语"This"不被识别为cmdlet,函数,脚本文件或可操作程序的名称.检查名称的拼写,或者如果包含路径,请验证路径是否正确,然后重试.
所以它试图将字符串视为一个commad,就好像我刚刚This is a string在我的脚本中的新行上键入它一样.
如果我换行
$status = "This is a string"
Run Code Online (Sandbox Code Playgroud)
至
$status = 'This is a string'
Run Code Online (Sandbox Code Playgroud)
该脚本按预期工作,只是输出字符串This is a string.
我注意到的另一个奇怪的问题是,如果我不使用变量,只需使用:
Write-Output "This is a string"
Run Code Online (Sandbox Code Playgroud)
然后它在一个单独的行上输出每个单词,如下所示:
这个
是
一个
串
但如果我使用这样的单引号:
Write-Output 'This is a string'
Run Code Online (Sandbox Code Playgroud)
然后它按预期在一行输出整个句子.
有人知道为什么PowerShell在这些情况下会表现得很奇怪吗?
正如TessellatingHeckler所提到的,解决方案是用双引号,单引号包装任何双引号,或者你可以使用括号.
所以在我的例子中,你会改变: …
我正在制作一个宾果游戏,而在宾果游戏中,一张卡是一个5x5的数字网格(减去"免费"中心空间).我正在寻找一种以强类型方式表示5x5网格的方法.它可能是5x5网格的整数,bool,某些类等.我最初的想法是使用二维数组,但这有一个问题,我不允许指定大小所以当传递对象时,有其他类无法知道它应该有5行和5列.
例如,我可能会创建接口:
public interface ICard
{
int[,] cells { get; }
}
Run Code Online (Sandbox Code Playgroud)
但是没有在这里明确声明整数数组有5行和5列.另外,为了定义匹配的模式,我可能会使用5x5的布尔网格,所以我希望它看起来像这样:
public interface ICard<T>
{
T[,] cells { get; }
}
Run Code Online (Sandbox Code Playgroud)
那么我该如何改变它来代替返回一个强类型的Card对象,该对象强制执行应该只有5行和5列的规则,并使其显而易见.我认为我的问题的答案是创建一个新的Card类,但我不确定如何以优雅的方式执行它,强制执行并显示它是5x5网格.
任何想法都表示赞赏.谢谢.
感谢所有提供答案的人.根据所有答案,我提出了一些混合方法.这是我最终做的事情:
创建了一个新的通用Matrix接口和类:
public interface IMatrix<T>
{
int NumberOfColumns { get; }
int NumberOfRows { get; }
T GetCell(int column, int row);
void SetCell(int column, int row, T value);
}
public class Matrix<T> : IMatrix<T>
{
protected readonly T[,] Cells;
public int NumberOfColumns { get; }
public int NumberOfRows { get; }
public Matrix(int numberOfColumns, …Run Code Online (Sandbox Code Playgroud) 我正在使用WPF/.NET 4,当我将VirtualizingStackPanel.VirtualizationMode ="Recycling"属性添加到我的ListBoxes时,它会导致相同的列表项在滚动时反复重复.例如,假设我有一个包含100个项目的ListBox,一次可见10个.当ListBox首次加载时,我看到项目1 - 10,但当我开始向下滚动以查看剩余项目11 - 100时,项目1 - 10在我向下滚动时反复重复,所以我永远无法查看项目11 - 100.如果我将Recycling更改回Standard,那么一切正常,但滚动速度非常慢(我的ListItems相当复杂,其中有几个图像,文本字段和按钮).当回收打开时,滚动速度非常快,但我只能查看项目1 - 10.任何有关错误或如何修复的想法?提前致谢.
powershell ×4
.net ×2
c# ×2
function ×2
node.js ×2
npm ×2
.net-4.5 ×1
arrays ×1
async-await ×1
asynchronous ×1
directory ×1
grunt-cli ×1
gruntjs ×1
listbox ×1
maui ×1
module ×1
recycle ×1
redirect ×1
return-type ×1
scriptblock ×1
settings ×1
stderr ×1
stream ×1
string ×1
synchronous ×1
tfs ×1
wpf ×1